Android播放器MediaPlayer与MediaRecorder:录制音频并播放
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按钮控制播放器和“录音机”:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/startRecorder" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="开始录制" /> <Button android:id="@+id/stopRecorder" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:text="停止录制" /> <Button android:id="@+id/startPlay" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:text="播放录音" /> <Button android:id="@+id/stopPlay" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:text="停止播放" /></RelativeLayout>
Java代码:
package zhangphil.mediarecorder;import java.io.File;import java.io.IOException;import android.app.Activity;import android.media.MediaPlayer;import android.media.MediaRecorder;import android.os.Bundle;import android.os.Environment;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;/** * 本例代码演示了录音 -> 播放的简单过程。 * 思路:先使用Android“录音机”MediaRecorder录制音段音频存放到手机的SDCard上,然后使用Android的播放器MediaPlayer * 整个过程由Button按钮控制。 */public class MainActivity extends Activity implements OnClickListener {// 播放器private MediaPlayer mMediaPlayer;// “录音机”private MediaRecorder mMediaRecorder;// 录制的音频文件private File audioFile;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 开始录音按钮Button startRecorder = (Button) findViewById(R.id.startRecorder);startRecorder.setOnClickListener(this);// 停止录音按钮Button stopRecorder = (Button) findViewById(R.id.stopRecorder);stopRecorder.setOnClickListener(this);// 播放器开始播放录音按钮Button startPlay = (Button) findViewById(R.id.startPlay);startPlay.setOnClickListener(this);// 播放器停止播放录音按钮Button stopPlay = (Button) findViewById(R.id.stopPlay);stopPlay.setOnClickListener(this);// 播放器mMediaPlayer = new MediaPlayer();// “录音机”mMediaRecorder = new MediaRecorder();// 麦克风源录音mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);// 输出格式mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);// 编码格式mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);// 根目录File sdcard = Environment.getExternalStorageDirectory();// 将录制的音频文件存储到SDCard根目录下audioFile = new File(sdcard, "zhangphil.amr");try {audioFile.createNewFile();} catch (IOException e) {e.printStackTrace();}}// 开始录音private void startRecorder() throws Exception {// 设置录制音频的输出存放文件mMediaRecorder.setOutputFile(audioFile.getAbsolutePath());// 预备!mMediaRecorder.prepare();// 开始录音!mMediaRecorder.start();}// 停止录音private void stopRecorder() {// 停止录音mMediaRecorder.stop();// 释放资源mMediaRecorder.release();}// 开始播放声音音频private void startPlay() throws Exception {// 重置mMediaPlayer.reset();// 设置播放器的声音源mMediaPlayer.setDataSource(audioFile.getAbsolutePath());// 也可以从一个静态资源文件中加载音频数据源// mMediaPlayer.create(this, R.raw.xxx);if (!mMediaPlayer.isPlaying()) {mMediaPlayer.prepare();mMediaPlayer.start();// 如果设置循环true,那么将循环播放// mMediaPlayer.setLooping(true);} else {mMediaPlayer.pause();}}// 停止播放private void stopPlay() {// 如果播放器在播放声音,停止mMediaPlayer.stop();}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.startRecorder:try {startRecorder();} catch (Exception e) {e.printStackTrace();}break;case R.id.stopRecorder:stopRecorder();break;case R.id.startPlay:try {startPlay();} catch (Exception e) {e.printStackTrace();}break;case R.id.stopPlay:stopPlay();break;}}// 注意在onDestory中销毁、回收资源@Overrideprotected void onDestroy() {super.onDestroy();if (mMediaPlayer.isPlaying()) {mMediaPlayer.stop();}// 释放资源mMediaPlayer.release();mMediaRecorder.release();}}
不要忘记在AndroidManifest.xml添加权限:
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/>
更多相关文章
- 【Android 应用开发】Android资源文件 - 使用资源存储字符串 颜
- Android应用开发相关下载资源(2013/03/22更新)
- Android新增音频流类型
- Android官方入门文档[6]添加Action按钮
- Android中将资源文件转为Bitmap对象
- Android彻底组件化—代码和资源隔离
- android中编译资源文件的相关问题
- 学习资源推荐