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"/>

更多相关文章

  1. Android(安卓)3.0 r1 API中文文档(107) ―― AsyncPlayer
  2. Android(安卓)VideoPlayer
  3. Android新增音频流类型
  4. android 闪光灯控制
  5. webrtc 之android与PC互通
  6. android 发送语音功能和ios交互格式aac
  7. Android使用VideoView全屏播放视频拉伸变形解决办法
  8. Android网络电台的一种实现方案(歌醉原创)
  9. Android录音下————AudioRecord源码分析

随机推荐

  1. 存储卡里面的文件夹无法访问也打不开文件
  2. 存储卡出现“无法访问此卷不包含可识别的
  3. 求助损坏打不开怎样才能把磁盘修好
  4. uniapp获取并修改原生搜索框的占位内容
  5. 损坏打不开 chkdsk无法修复. 不知道怎么
  6. laravel8 模型工厂数据填充填坑
  7. U盘插上时显示请将磁盘插入驱动器请问如
  8. flex 基础
  9. 常用数据库操作指令
  10. 遇到位置不可用,无法访问参数错误怎么解决