为了账号安全,请及时绑定邮箱和手机立即绑定

【学习打卡】第5天 即时通讯项目里面的语音处理-基础实现篇

标签:
Android

课程名称:即时通讯项目里面的语音处理-基础实现篇
课程章节:2-3 Android-字节流模式声音录制功能实现-上
主讲老师:Piasy

课程内容:

今天学习内容有:

  • volatile关键字
  • 功能实现的业务逻辑

课程收获:

  • volatile关键字

老师的例子是:private volatile boolean mIsRecording;
按我的理解,应该就是类似于kotlin的lateinit var mIsRecording: AtomicBoolean

  • 功能实现的业务逻辑

这里跟前两天的业务逻辑差别不大,这里就不做赘述了,可以参考我在gitee上面的代码
大致逻辑是:

  • 创建录音文件
  • 创建文件输出流
  • 配置AudioRecorder
  • 记录开始录音时间
  • 循环读取数据,写入输出流
  • 根据录音状态退出循环
  • 代码逻辑大致如下,估计下节课老师会带着我们完善实现代码
	lateinit var mAudioFile:File
    lateinit var viewBinding: ActivityAnotherRecorderBinding

    // 原子化的布尔值,线程安全
    lateinit var bIsRecording: AtomicBoolean

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewBinding = ActivityAnotherRecorderBinding.inflate(layoutInflater)
        setContentView(viewBinding.root)

        bIsRecording.set(false)
        viewBinding.btnRecord.setOnClickListener {
            if (bIsRecording.get()) {
                // 停止录音
                if (!stopRecord()){
                    showFailMsg("结束录音失败")
                }
            } else {
                // 开始录音
                if (!startRecord()) {
                    showFailMsg("录音失败")
                }
            }
            changeUIState()
        }
    }

    /**
     * 提示错误信息
     */
    private fun showFailMsg(errMsg: String) {
        uiThread {
            Toast.makeText(this@AnotherRecordActivity, errMsg, Toast.LENGTH_SHORT).show()
        }
    }

    /**
     * 停止录音代码
     */
    private fun stopRecord(): Boolean {
        bIsRecording.set(false)
    }

    /**
     * 开始录音代码
     */
    private fun startRecord(): Boolean {
        bIsRecording.set(true)
        // 创建录音文件
        createRecordFile()

        // 创建文件输出流

        // 配置AudioRecorder

        // 记录开始录音时间

        // 循环读取数据,写入输出流

        // 根据录音状态退出循环

        return true
    }

    /**
     * 更新界面
     */
    private fun changeUIState() {
        viewBinding.btnRecord.text = if (bIsRecording.get()) "停止录制" else "开始录音"
    }

    /**
     * 创建录音文件
     */
    private fun createRecordFile(){
        // 创建录音文件
        var path = ""
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) {
                path = "${application.filesDir}/iMookDemo/"
            } else {
                val external = applicationContext.getExternalFilesDir(null)
                if (external != null) {
                    path = external.absolutePath
                }
            }
        } else {
            path = applicationContext.filesDir.absolutePath
        }
        mAudioFile =
            File("${path}/${System.currentTimeMillis()}.pcm")
        if (!mAudioFile.parentFile.exists()) {
            val mddirResult = mAudioFile.parentFile?.mkdir()
        }
        mAudioFile.createNewFile()
    }

图片描述

图片描述

图片描述

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消