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


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

    区别

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

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

    MediaRecorder的使用

    MediaRecorder执行流程如下:官方Api介绍

    总的来说就是:初始化–>设置数据源–>准备–>开始工作–>停止工作–>释放资源

    本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

    具体参考下面代码:

    1. class MediaActivity : AppCompatActivity() {
    2. //音频播放器
    3. private var mediaPlayer: MediaPlayer? = null
    4. //音频录制
    5. private var mediaRecorder: MediaRecorder? = null
    6. //是否正在录制
    7. private var isRecording = false
    8. //文件保存位置
    9. private lateinit var filePath: String
    10. override fun onCreate(savedInstanceState: Bundle?) {
    11. super.onCreate(savedInstanceState)
    12. setContentView(R.layout.activity_media)
    13. filePath = "${externalCacheDir!!.absolutePath}/test.3gp"
    14. }
    15. /**
    16. * 开始录制
    17. */
    18. fun startRecord(view: View) {
    19. if (isRecording) {
    20. return
    21. }
    22. ct_time.start()
    23. mediaRecorder = MediaRecorder()
    24. //设置音频来源,这里是来自麦克风
    25. mediaRecorder?.setAudioSource(MediaRecorder.AudioSource.MIC)
    26. //设置输出的音频文件格式,这里设置为3gp
    27. mediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
    28. //设置文件保存路径
    29. mediaRecorder?.setOutputFile(filePath)
    30. //设置音频编码,注意与输出格式的匹配,具体类型查看官网介绍
    31. mediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
    32. try {
    33. //准备
    34. mediaRecorder?.prepare()
    35. } catch (e: Exception) {
    36. Log.e("Test", "mediaRecorder.prepare() failed")
    37. }
    38. //开始录制
    39. mediaRecorder?.start()
    40. isRecording = true
    41. }
    42. /**
    43. * 停止录制
    44. */
    45. fun stopRecord(view: View) {
    46. ct_time.stop()
    47. mediaRecorder?.stop()
    48. //释放资源
    49. mediaRecorder?.release()
    50. mediaRecorder = null
    51. isRecording = false
    52. }
    53. /**
    54. * 播放音频
    55. */
    56. fun startPlay(view: View) {
    57. if (mediaPlayer != null && mediaPlayer!!.isPlaying) {
    58. return
    59. }
    60. mediaPlayer = MediaPlayer()
    61. //设置音频数据来源
    62. mediaPlayer?.setDataSource(filePath)
    63. try {
    64. //缓冲
    65. mediaPlayer?.prepare()
    66. } catch (e: Exception) {
    67. Log.e("Test", "mediaPlayer.prepare() failed")
    68. }
    69. //播放
    70. mediaPlayer?.start()
    71. mediaPlayer?.setOnCompletionListener {
    72. //播放完毕监听
    73. }
    74. mediaPlayer?.setOnErrorListener { mp, what, extra ->
    75. //播放出错监听
    76. false
    77. }
    78. }
    79. /**
    80. * 停止播放
    81. */
    82. fun stopPlay(view: View) {
    83. mediaPlayer?.stop()
    84. mediaPlayer?.release()
    85. mediaPlayer = null
    86. }
    87. override fun onStop() {
    88. super.onStop()
    89. mediaPlayer?.release()
    90. mediaPlayer = null
    91. mediaRecorder?.release()
    92. mediaRecorder = null
    93. }
    94. }

    录制音频需要申请权限:android.permission.RECORD_AUDIO 

    如果你对音视频开发感兴趣,觉得文章对您有帮助,别忘了点赞、收藏哦!或者对本文的一些阐述有自己的看法,有任何问题,欢迎在下方评论区讨论!

    本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

  • 相关阅读:
    国际结算业务
    打不动的蓝桥杯
    Java学习Day021(类和对象)
    idea 超实用的插件
    Spark-Scala语言实战(17)
    vue form设置rules不生效
    8.jib-maven-plugin构建springboot项目镜像,docker部署配置
    JVM Metaspace内存溢出问题
    设计模式:模板方法模式(C++实现)
    2023年度AWS SAP直冲云霄训练营学习分享
  • 原文地址:https://blog.csdn.net/m0_60259116/article/details/127428642