Android音视频开发:MediaRecorder录制音频

Android 多媒体框架针对音频录制提供了两种方法:MediaRecorder和AudioRecord。

区别

MediaRecorder:录制的音频文件是经过压缩后的,需要设置编码器,并且录制的音频文件可以用系统自带的播放器播放。MediaRecorder属于系统Api高度封装,所以可扩展性和可用性都比较局限,支持的格式过少并且无法实时处理音频数据,使用场景如语音消息录制等,值得一提的是MediaRecorder通常和视频录制一起使用。

AudioRecord:主要实现对音频实时处理以及边录边播功能,录制的是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,需要用AudioTrack来播放,当然也可以对数据进行编码压缩,从而转换成我们常见的音频格式。使用的场景有实时音频传输,音视频录制处理等等,以后涉及到音视频编解码时会用到。

MediaRecorder的使用

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↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

猜你喜欢

转载自blog.csdn.net/m0_60259116/article/details/127428642