Android音视频开发(四)MediaRecorder录制音频

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

猜你喜欢

转载自blog.csdn.net/gs12software/article/details/104892980