Java教程

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

本文主要是介绍【学习打卡】第5天 即时通讯项目里面的语音处理-基础实现篇,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

课程名称:即时通讯项目里面的语音处理-基础实现篇
课程章节: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()
    }

图片描述

图片描述

图片描述

这篇关于【学习打卡】第5天 即时通讯项目里面的语音处理-基础实现篇的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!