自定义音视频基类二
程序员文章站
2022-07-01 13:53:56
...
上一章简述了视频采集相关知识,本章为音频采集,音频采集相对视频采集简单了许多,在自定义基类中加入如下代码
// 采样率
private val sampleRateInHz = 44100
// 音频通道 立体声:
val stereo = AudioFormat.CHANNEL_IN_STEREO
lateinit var audioRecord: AudioRecord
//audioRecord能接受的最小的buffer大小
private var bufferSizeInBytes: Int = 0
//录音线程
private var recordingJob: Job? = null
/**
* 初始化AudioRecord
*/
fun initAudioRecord(channelConfig: Int = AudioFormat.CHANNEL_IN_MONO) {
//audioRecord能接受的最小的buffer大小
bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, AudioFormat.ENCODING_PCM_16BIT)
audioRecord = AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz, channelConfig, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes)
}
/**
* 开始录音
*/
fun startRecording() {
recordingJob = GlobalScope.launch(Dispatchers.IO) {
if (bufferSizeInBytes > 0) {
audioRecord.startRecording()
while (isActive) {
val buffer = ByteArray(bufferSizeInBytes)
val len = audioRecord.read(buffer, 0, buffer.size)
if (len > 0) {
//音频编码
audioCoding(buffer, len)
}
}
} else {
launch(Dispatchers.Main) {
showToast("请先初始化AudioRecord类")
}
}
}
}
/**
* 音频编码
*/
abstract fun audioCoding(buffer: ByteArray, len: Int)
/**
* 结束录音
*/
fun endRecording() {
if (audioRecord.recordingState == AudioRecord.RECORDSTATE_RECORDING) {
audioRecord.stop()
}
if (audioRecord.state == AudioRecord.STATE_INITIALIZED) {
audioRecord.release()
}
recordingJob?.cancel()
}
override fun onDestroy() {
super.onDestroy()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cameraDevice?.close()
for (surface in outputs) {
surface.release()
}
endRecording()
releaseBackgroundThread()
}
}
使用也很简单,继承这个基类必须实现该方法
/**
* 音频编码,注意这里是在子线程中的
*/
override fun audioCoding(buffer: ByteArray, len: Int) {
}
当然在使用前必须进行初始化操作
//初始化AudioRecord
initAudioRecord()
然后在合适的地方调用
//开始录音
startRecording()
下一篇: ffmpeg 转码去掉B帧 H265
推荐阅读
-
(十七)c#Winform自定义控件-基类窗体
-
C#_Excel数据读取与写入_自定义解析封装类_支持设置标题行位置&使用excel表达式收集数据&单元格映射&标题映射&模板文件的参数数据替换(第二版-增加深度读取和更新功能)
-
WindowsPhone自定义控件详解(二) - 模板类库分析
-
ThinkPHP5.0框架控制器继承基类和自定义类示例
-
WPF自学入门(九)WPF自定义窗口基类
-
自定义音视频基类二
-
自定义音视频基类一
-
ThinkPHP 3.2 自定义基类 Model
-
android 自定义登陆对话框基类封装,且随着软键盘的弹起自动移动位置
-
ML:基于自定义数据集利用Logistic、梯度下降算法GD、LoR逻辑回归、Perceptron感知器、SVM支持向量机、LDA线性判别分析算法进行二分类预测(决策边界可视化)