Android 多媒体框架针对音频录制提供了两种方法:MediaRecorder和AudioRecord。
区别
MediaRecorder:录制的音频文件是经过压缩后的,需要设置编码器,并且录制的音频文件可以用系统自带的播放器播放。MediaRecorder属于系统Api高度封装,所以可扩展性和可用性都比较局限,支持的格式过少并且无法实时处理音频数据,使用场景如语音消息录制等,值得一提的是MediaRecorder通常和视频录制一起使用。
AudioRecord:主要实现对音频实时处理以及边录边播功能,录制的是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,需要用AudioTrack来播放,当然也可以对数据进行编码压缩,从而转换成我们常见的音频格式。使用的场景有实时音频传输,音视频录制处理等等,以后涉及到音视频编解码时会用到。
MediaRecorder的使用
MediaRecorder执行流程如下:官方Api介绍
总的来说就是:初始化–>设置数据源–>准备–>开始工作–>停止工作–>释放资源
具体参考下面代码:
class MediaActivity : AppCompatActivity() {
//音频播放器
private var mediaPlayer: MediaPlayer? = null
//音频录制
private var mediaRecorder: MediaRecorder? = null
//是否正在录制
private var isRecording = false
//文件保存位置
private lateinit var filePath: String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_media)
filePath = "${externalCacheDir!!.absolutePath}/test.3gp"
}
/**
* 开始录制
*/
fun startRecord(view: View) {
if (isRecording) {
return
}
ct_time.start()
mediaRecorder = MediaRecorder()
//设置音频来源,这里是来自麦克风
mediaRecorder?.setAudioSource(MediaRecorder.AudioSource.MIC)
//设置输出的音频文件格式,这里设置为3gp
mediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
//设置文件保存路径
mediaRecorder?.setOutputFile(filePath)
//设置音频编码,注意与输出格式的匹配,具体类型查看官网介绍
mediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
try {
//准备
mediaRecorder?.prepare()
} catch (e: Exception) {
Log.e("Test", "mediaRecorder.prepare() failed")
}
//开始录制
mediaRecorder?.start()
isRecording = true
}
/**
* 停止录制
*/
fun stopRecord(view: View) {
ct_time.stop()
mediaRecorder?.stop()
//释放资源
mediaRecorder?.release()
mediaRecorder = null
isRecording = false
}
/**
* 播放音频
*/
fun startPlay(view: View) {
if (mediaPlayer != null && mediaPlayer!!.isPlaying) {
return
}
mediaPlayer = MediaPlayer()
//设置音频数据来源
mediaPlayer?.setDataSource(filePath)
try {
//缓冲
mediaPlayer?.prepare()
} catch (e: Exception) {
Log.e("Test", "mediaPlayer.prepare() failed")
}
//播放
mediaPlayer?.start()
mediaPlayer?.setOnCompletionListener {
//播放完毕监听
}
mediaPlayer?.setOnErrorListener { mp, what, extra ->
//播放出错监听
false
}
}
/**
* 停止播放
*/
fun stopPlay(view: View) {
mediaPlayer?.stop()
mediaPlayer?.release()
mediaPlayer = null
}
override fun onStop() {
super.onStop()
mediaPlayer?.release()
mediaPlayer = null
mediaRecorder?.release()
mediaRecorder = null
}
}
录制音频需要申请权限:android.permission.RECORD_AUDIO
如果你对音视频开发感兴趣,觉得文章对您有帮助,别忘了点赞、收藏哦!或者对本文的一些阐述有自己的看法,有任何问题,欢迎在下方评论区讨论!