概述:
Android多媒體框架包含對捕捉和編碼各種常見音頻格式的支持, 所以我們可以簡單的集成音頻操作到我們的APP中. 我們可以通過MediaRecorder API來錄製聲音, 前提是有可以支持的硬件. .
該文檔描述瞭如何寫一個APP來從麥克風捕捉音頻, 並保存和播放音頻. Android模擬器沒有能力捕捉音頻, 但是真實設備可能會提供這些功能.
處理音頻捕捉:
從設備捕捉音頻相對音視頻播放來說會閒的稍微複雜一些, 但是依然挺簡單的:
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()方法來釋放它. 官方建議我們總是在使用結束之後調用它, 而不要寄希望於垃圾回收.
栗子: 錄音和播放錄音:
下面的代碼展示瞭如何設置啓動和停止錄音, 並且播放保存的音頻文件.
/*
* The application needs to have the permission to write to externalstorage
* 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-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />
* <uses-permissionandroid: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 classAudioRecordTest
extendsActivity
{
private staticfinal
String LOG_TAG=
"AudioRecordTest";
private staticString 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 RecordButtonextends
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 PlayButtonextends
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;
}
}
}
參考: https://developer.android.com/guide/topics/media/audio-capture.html