Android 多媒体框架针对音频录制提供了两种方法:MediaRecorder和AudioRecord。
MediaRecorder:录制的音频文件是经过压缩后的,需要设置编码器,并且录制的音频文件可以用系统自带的播放器播放。MediaRecorder属于系统Api高度封装,所以可扩展性和可用性都比较局限,支持的格式过少并且无法实时处理音频数据,使用场景如语音消息录制等,值得一提的是MediaRecorder通常和视频录制一起使用。
AudioRecord:主要实现对音频实时处理以及边录边播功能,录制的是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,需要用AudioTrack来播放,当然也可以对数据进行编码压缩,从而转换成我们常见的音频格式。使用的场景有实时音频传输,音视频录制处理等等,以后涉及到音视频编解码时会用到。
MediaRecorder执行流程如下:官方Api介绍

总的来说就是:初始化–>设置数据源–>准备–>开始工作–>停止工作–>释放资源
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
具体参考下面代码:
- 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
如果你对音视频开发感兴趣,觉得文章对您有帮助,别忘了点赞、收藏哦!或者对本文的一些阐述有自己的看法,有任何问题,欢迎在下方评论区讨论!
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓