Android音频捕获(录音)

来源:互联网 发布:模拟炒股软件 知乎 编辑:程序博客网 时间:2024/04/30 00:14

Android多媒体框架支持捕获和编码多种常见的音频格式,所以您可以轻松地将音频集成到您的应用程序。您可以使用麦克风和MediaRecorder组件API录制音频。

本文档会教您如何通过麦克风录制音频和回放音频

注意:Android模拟器没有捕获音频的能力,但实际的设备可能会提供这些功能,调试时尽量使用真机调试。

第一步,准备开始录音

音频捕获(录音)是相对于音视频播放更加复杂的一个过程,但是实现起来还是很简单的。

我们需要按照下边的步骤实现:

1.在使用音频捕获时,需要我们在清单文件(AndroidManifest.xml)中加入两个权限  

外部存储可写权限,因为我们录制的音频文件可能要存储在外部存储器中。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

允许捕获音频权限,这是音频捕获的必要权限。
<uses-permission android:name="android.permission.RECORD_AUDIO" />

2.创建一个android.media.MediaRecorder实例。

3.使用MediaRecorder.setAudioSource设置音频源()。你可能会用到MediaRecorder.AudioSource.MIC(麦克风设备)。

4.使用MediaRecorder.setOutputFormat()设置输出文件格式

5.使用MediaRecorder.setOutputFile()设置输出文件名称

6.使用MediaRecorder.setAudioEncoder()设置音频编码器

7.调用MediaRecorder实例的prepare()函数进入准备阶段。

8.调用MediaRecorder实例的start()函数开始捕获(录音)

9.调用MediaRecorder实例的stop()函数停止捕获(录音)

10.当您停止或退出录音功能时调用MediaRecorder实例的release()函数释放MediaRecorder实例资源,此函数一定要在不使用时主动调用,否则会出现内存或者其他异常

下边为示例源码

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;        }    }}
本文翻译自谷歌官方Android开发文档

https://developer.android.com/intl/zh-cn/guide/topics/media/audio-capture.html#audiocapture

0 0