Android播放器MediaPlayer与MediaRecorder:录制音频并播放

古城微笑少年丶 2022-08-17 13:28 409阅读 0赞



Android播放器MediaPlayer与MediaRecorder:录制音频并播放

以下以使用Android的MediaPlayer和MediaRecorder录制音频为例加以说明:
(1)Android MediaPlayer
本例以Android MediaPlayer播放Android音频资源为说明。使用MediaPlayer,首先要给MediaPlayer设置Media音频资源路径,或者也可以从一个R.raw.xxx这样的资源文件加载等等。
然后prepare使得MediaPlayer进行播放前的各种准备工作和初始化过程。
当MediaPlayer调用start后,就将启动正式的音频播放。如果MediaPlayer设置setLooping(true)那么将循环播放这段音频,类似常用的播放器中的“单曲循环”。
MediaPlayer的暂停时pause。MediaPlayer的完全停止时stop。在使用完MediaPlayer时候,不要忘记释放MediaPlayer的资源。通常在Android的onDestory()中release。

(2)Android MediaRecorder
本例中MediaRecorder录制一段音频(从麦克风,话筒)。
MediaRecorder在录制前需要先定义一些基本属性和参数如录制音频存放的位置:
setAudioSource
输出的音频格式:
setOutputFormat
音频的编码格式:
setAudioEncoder
以上参数,简单期间可以使用缺省的、默认的设置参数DEFAULT。

在本例中,MediaRecorder的prepare()准备录音设备,MediaRecorder的start()将正式开始录音。

写一个简单的代码加以说明。
先写一个布局文件,布局几个Button按钮控制播放器和“录音机”:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <Button
  6. android:id="@+id/startRecorder"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:layout_alignParentLeft="true"
  10. android:layout_alignParentTop="true"
  11. android:text="开始录制" />
  12. <Button
  13. android:id="@+id/stopRecorder"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:layout_alignParentRight="true"
  17. android:layout_alignParentTop="true"
  18. android:text="停止录制" />
  19. <Button
  20. android:id="@+id/startPlay"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:layout_alignParentBottom="true"
  24. android:layout_alignParentLeft="true"
  25. android:text="播放录音" />
  26. <Button
  27. android:id="@+id/stopPlay"
  28. android:layout_width="wrap_content"
  29. android:layout_height="wrap_content"
  30. android:layout_alignParentBottom="true"
  31. android:layout_alignParentRight="true"
  32. android:text="停止播放" />
  33. </RelativeLayout>

Java代码:

  1. package zhangphil.mediarecorder;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import android.app.Activity;
  5. import android.media.MediaPlayer;
  6. import android.media.MediaRecorder;
  7. import android.os.Bundle;
  8. import android.os.Environment;
  9. import android.view.View;
  10. import android.view.View.OnClickListener;
  11. import android.widget.Button;
  12. /**
  13. * 本例代码演示了录音 -> 播放的简单过程。
  14. * 思路:先使用Android“录音机”MediaRecorder录制音段音频存放到手机的SDCard上,然后使用Android的播放器MediaPlayer
  15. * 整个过程由Button按钮控制。
  16. */
  17. public class MainActivity extends Activity implements OnClickListener {
  18. // 播放器
  19. private MediaPlayer mMediaPlayer;
  20. // “录音机”
  21. private MediaRecorder mMediaRecorder;
  22. // 录制的音频文件
  23. private File audioFile;
  24. @Override
  25. protected void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.activity_main);
  28. // 开始录音按钮
  29. Button startRecorder = (Button) findViewById(R.id.startRecorder);
  30. startRecorder.setOnClickListener(this);
  31. // 停止录音按钮
  32. Button stopRecorder = (Button) findViewById(R.id.stopRecorder);
  33. stopRecorder.setOnClickListener(this);
  34. // 播放器开始播放录音按钮
  35. Button startPlay = (Button) findViewById(R.id.startPlay);
  36. startPlay.setOnClickListener(this);
  37. // 播放器停止播放录音按钮
  38. Button stopPlay = (Button) findViewById(R.id.stopPlay);
  39. stopPlay.setOnClickListener(this);
  40. // 播放器
  41. mMediaPlayer = new MediaPlayer();
  42. // “录音机”
  43. mMediaRecorder = new MediaRecorder();
  44. // 麦克风源录音
  45. mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
  46. // 输出格式
  47. mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
  48. // 编码格式
  49. mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
  50. // 根目录
  51. File sdcard = Environment.getExternalStorageDirectory();
  52. // 将录制的音频文件存储到SDCard根目录下
  53. audioFile = new File(sdcard, "zhangphil.amr");
  54. try {
  55. audioFile.createNewFile();
  56. } catch (IOException e) {
  57. e.printStackTrace();
  58. }
  59. }
  60. // 开始录音
  61. private void startRecorder() throws Exception {
  62. // 设置录制音频的输出存放文件
  63. mMediaRecorder.setOutputFile(audioFile.getAbsolutePath());
  64. // 预备!
  65. mMediaRecorder.prepare();
  66. // 开始录音!
  67. mMediaRecorder.start();
  68. }
  69. // 停止录音
  70. private void stopRecorder() {
  71. // 停止录音
  72. mMediaRecorder.stop();
  73. // 释放资源
  74. mMediaRecorder.release();
  75. }
  76. // 开始播放声音音频
  77. private void startPlay() throws Exception {
  78. // 重置
  79. mMediaPlayer.reset();
  80. // 设置播放器的声音源
  81. mMediaPlayer.setDataSource(audioFile.getAbsolutePath());
  82. // 也可以从一个静态资源文件中加载音频数据源
  83. // mMediaPlayer.create(this, R.raw.xxx);
  84. if (!mMediaPlayer.isPlaying()) {
  85. mMediaPlayer.prepare();
  86. mMediaPlayer.start();
  87. // 如果设置循环true,那么将循环播放
  88. // mMediaPlayer.setLooping(true);
  89. } else {
  90. mMediaPlayer.pause();
  91. }
  92. }
  93. // 停止播放
  94. private void stopPlay() {
  95. // 如果播放器在播放声音,停止
  96. mMediaPlayer.stop();
  97. }
  98. @Override
  99. public void onClick(View v) {
  100. switch (v.getId()) {
  101. case R.id.startRecorder:
  102. try {
  103. startRecorder();
  104. } catch (Exception e) {
  105. e.printStackTrace();
  106. }
  107. break;
  108. case R.id.stopRecorder:
  109. stopRecorder();
  110. break;
  111. case R.id.startPlay:
  112. try {
  113. startPlay();
  114. } catch (Exception e) {
  115. e.printStackTrace();
  116. }
  117. break;
  118. case R.id.stopPlay:
  119. stopPlay();
  120. break;
  121. }
  122. }
  123. // 注意在onDestory中销毁、回收资源
  124. @Override
  125. protected void onDestroy() {
  126. super.onDestroy();
  127. if (mMediaPlayer.isPlaying()) {
  128. mMediaPlayer.stop();
  129. }
  130. // 释放资源
  131. mMediaPlayer.release();
  132. mMediaRecorder.release();
  133. }
  134. }

不要忘记在AndroidManifest.xml添加权限:

  1. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  3. <uses-permission android:name="android.permission.RECORD_AUDIO"/>

发表评论

表情:
评论列表 (有 0 条评论,409人围观)

还没有评论,来说两句吧...

相关阅读