【学习打卡】第5天 即时通讯项目里面的语音处理-基础实现篇
2022/8/7 4:22:44
本文主要是介绍【学习打卡】第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天 即时通讯项目里面的语音处理-基础实现篇的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?