作者:怪话greenup | 来源:互联网 | 2023-06-28 12:12
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: Stringoverride 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)//设置输出的音频文件格式,这里设置为3gpmediaRecorder?.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 = nullisRecording = 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 = nullmediaRecorder?.release()mediaRecorder = null}
}
录制音频需要申请权限:android.permission.RECORD_AUDIO
如果你对音视频开发感兴趣,觉得文章对您有帮助,别忘了点赞、收藏哦!或者对本文的一些阐述有自己的看法,有任何问题,欢迎在下方评论区讨论!
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓