Android 音频录制(Audio Capture)

来源:互联网 发布:数控机床编程步骤 编辑:程序博客网 时间:2024/06/09 22:03

本文是 Android Developer 上官方文档的个人翻译,囿于作者英文水平,可能比较粗糙,原文如下:

原文:http://developer.android.com/intl/zh-cn/guide/topics/media/audio-capture.html


Android 多媒体框架包含了对录制和编码为多种音频格式的支持,因此你可以很简单地将音频集成到自己的应用中。如果设备支持的话,你可以使用 MediaRecorder APIs 来录制音频。

本文档向你展示如何编写一个应用,可以从设备的麦克风录制音频、保存并播放。

注意:Android 模拟器没有录制音频的能力,真机一般都会有这种功能。

执行音频录制(Performing Audio Capture)


音频录制相对音频和视频的播放来说稍微有一点复杂,但仍然相当简单:

  1. 创建一个 android.media.MediaRecorder 实例;
  2. 使用 MediaRecorder.setAudioSource() 设置音频来源,你有可能会使用 MediaRecorder.AudioSource.MIC
  3. 使用 MediaRecorder.setOutputFormat() 设置输出文件类型;
  4. 使用 MediaRecorder.setOutputFile() 设置输出文件名;
  5. 使用 MediaRecorder.setAudioEncoder() 设置音频编码器;
  6. 在 MediaRecorder 实例上调用 MediaRecorder.prepare();
  7. 调用 MediaRecorder.start() 开始音频录制;
  8. 调用 MediaRecorder.stop() 停止录制;
  9. 当你使用完 MediaRecorder 实例,调用它的 MediaRecorder.release() 方法,该方法可以立即释放 MediaRecorder 所占有的资源。

示例:录制音频并播放录制的音频

下面的示例类演示了如何建立、开始和停止音频录制,最后播放录制的音频文件。

/* * The application needs to have the permission to write to external storage * if the output file is written to the external storage, and also the * permission to record audio. These permissions must be set in the * application's AndroidManifest.xml file, with something like: * * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> * <uses-permission android:name="android.permission.RECORD_AUDIO" /> * */package com.android.audiorecordtest;import android.app.Activity;import android.widget.LinearLayout;import android.os.Bundle;import android.os.Environment;import android.view.ViewGroup;import android.widget.Button;import android.view.View;import android.view.View.OnClickListener;import android.content.Context;import android.util.Log;import android.media.MediaRecorder;import android.media.MediaPlayer;import java.io.IOException;public class AudioRecordTest extends Activity{    private static final String LOG_TAG = "AudioRecordTest";    private static String mFileName = null;    private RecordButton mRecordButton = null;    private MediaRecorder mRecorder = null;    private PlayButton   mPlayButton = null;    private MediaPlayer   mPlayer = null;    private void onRecord(boolean start) {        if (start) {            startRecording();        } else {            stopRecording();        }    }    private void onPlay(boolean start) {        if (start) {            startPlaying();        } else {            stopPlaying();        }    }    private void startPlaying() {        mPlayer = new MediaPlayer();        try {            mPlayer.setDataSource(mFileName);            mPlayer.prepare();            mPlayer.start();        } catch (IOException e) {            Log.e(LOG_TAG, "prepare() failed");        }    }    private void stopPlaying() {        mPlayer.release();        mPlayer = null;    }    private void startRecording() {        mRecorder = new MediaRecorder();        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);        mRecorder.setOutputFile(mFileName);        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);        try {            mRecorder.prepare();        } catch (IOException e) {            Log.e(LOG_TAG, "prepare() failed");        }        mRecorder.start();    }    private void stopRecording() {        mRecorder.stop();        mRecorder.release();        mRecorder = null;    }    class RecordButton extends Button {        boolean mStartRecording = true;        OnClickListener clicker = new OnClickListener() {            public void onClick(View v) {                onRecord(mStartRecording);                if (mStartRecording) {                    setText("Stop recording");                } else {                    setText("Start recording");                }                mStartRecording = !mStartRecording;            }        };        public RecordButton(Context ctx) {            super(ctx);            setText("Start recording");            setOnClickListener(clicker);        }    }    class PlayButton extends Button {        boolean mStartPlaying = true;        OnClickListener clicker = new OnClickListener() {            public void onClick(View v) {                onPlay(mStartPlaying);                if (mStartPlaying) {                    setText("Stop playing");                } else {                    setText("Start playing");                }                mStartPlaying = !mStartPlaying;            }        };        public PlayButton(Context ctx) {            super(ctx);            setText("Start playing");            setOnClickListener(clicker);        }    }    public AudioRecordTest() {        mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();        mFileName += "/audiorecordtest.3gp";    }    @Override    public void onCreate(Bundle icicle) {        super.onCreate(icicle);        LinearLayout ll = new LinearLayout(this);        mRecordButton = new RecordButton(this);        ll.addView(mRecordButton,            new LinearLayout.LayoutParams(                ViewGroup.LayoutParams.WRAP_CONTENT,                ViewGroup.LayoutParams.WRAP_CONTENT,                0));        mPlayButton = new PlayButton(this);        ll.addView(mPlayButton,            new LinearLayout.LayoutParams(                ViewGroup.LayoutParams.WRAP_CONTENT,                ViewGroup.LayoutParams.WRAP_CONTENT,                0));        setContentView(ll);    }    @Override    public void onPause() {        super.onPause();        if (mRecorder != null) {            mRecorder.release();            mRecorder = null;        }        if (mPlayer != null) {            mPlayer.release();            mPlayer = null;        }    }}
0 0