课程名称:即时通讯项目里面的语音处理-基础实现篇
课程章节: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 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦