[关闭]
@cxm-2016 2016-09-18T15:07:14.000000Z 字数 2179 阅读 3102

Android:使用MediaRecorder录制音频

android no
陈小默(不足之处恳请批评指正)


MediaRecorder类是Android提供的用来录制音频的组件,其使用步骤基本如下[1]:

  • 创建MediaRecorder对象
  • 调用MediaRecorder对象的setAudioSource()方法来设置声音来源,一般传入MediaRecorder.AudioSource.MIC参数来指定录制来自麦克风的声音
  • 调用MediaRecorder对象的setOutputFormat()设置录制音频的格式
  • 调用MediaRecorder对象的setAudioEncoder()、setAudioEncodingBitRate(int bitRate)、setAudioSamplingRate(int samplingRate)设置所录声音的编码格式、编码位率、采样率等等,这些参数可以控制录制声音的品质。
  • 调用MediaRecorder的setOutputFile(String path)方法设置录制的音频文件的保存位置。
  • 调用MediaRecorder的prepare()方法准备录制
  • 调用MediaRecorder的start()方法开始录制
  • 调用MediaRecorder的stop()方法停止录制,并在结束后使用release()方法释放资源

--

实战演练

接下来我们编写一个Demo当我们按下按钮时录音,手指松开时停止
我们创建一套布局

  1. <RelativeLayout
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"/>
  4. <Button
  5. android:id="@+id/rRecorder"
  6. android:text="按下按钮录制" />
  7. <TextView
  8. android:text="0s"
  9. android:id="@+id/rTimer" />
  10. </RelativeLayout>

程序代码

  1. class RecorderActivity : AppCompatActivity() {
  2. val directory: String = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).absolutePath
  3. val recorder = MediaRecorder()
  4. var isPause = true
  5. var time = 0
  6. val loop: ThreadUtils.Loop = ThreadUtils.Loop(1000).loop {
  7. if (!isPause) {
  8. rTimer.text = "${time++}"
  9. }
  10. }
  11. override fun onCreate(savedInstanceState: Bundle?) {
  12. super.onCreate(savedInstanceState)
  13. setContentView(R.layout.activity_recoder)
  14. rRecorder.setOnTouchListener { view, motionEvent ->
  15. when (motionEvent.action) {
  16. MotionEvent.ACTION_DOWN -> {
  17. start()
  18. }
  19. MotionEvent.ACTION_UP -> {
  20. pause()
  21. }
  22. }
  23. true
  24. }
  25. recorder.setAudioSource(MediaRecorder.AudioSource.MIC)
  26. recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB)
  27. recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB)
  28. if (Build.VERSION.SDK_INT >= 10) {
  29. recorder.setAudioSamplingRate(44100)
  30. recorder.setAudioEncodingBitRate(96000)
  31. } else {
  32. // older version of Android, use crappy sounding voice codec
  33. recorder.setAudioSamplingRate(8000)
  34. recorder.setAudioEncodingBitRate(12200)
  35. }
  36. recorder.setOutputFile("$directory/${DateUtils.getTimeStamp()}.amr")
  37. recorder.prepare()
  38. }
  39. fun start() {
  40. if (isPause) {
  41. isPause = false
  42. recorder.start()
  43. loop.start()
  44. }
  45. }
  46. fun pause() {
  47. if (!isPause) {
  48. isPause = true
  49. //recorder.pause() API 24
  50. }
  51. }
  52. fun stop() {
  53. loop.destroy()
  54. recorder.stop()
  55. recorder.release()
  56. }
  57. override fun onDestroy() {
  58. stop()
  59. super.onDestroy()
  60. }
  61. }

[1] 李刚.疯狂安卓讲义.电子工业出版社.453-456
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注