Android開發中,實現錄音的方式主要有兩種:MediaRecorder
和 AudioRecord
。
兩者區別在於MediaRecorder錄製的文件是經過壓縮的,需要設置編碼器,錄製的文件系統可以直接播放。
而AudioRecord錄製的是PCM格式的文件,錄製的文件沒有經過編碼,需要使用AudioTrack播放。
使用步驟
一、添加權限
添加錄音胡權限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
RECORD_AUDIO
屬於運行時權限,申請權限:
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 1);
二、創建 MediaRecorder 對象
2.1、創建MediaRecorder對象
private MediaRecorder mRecorder;
mRecorder = new MediaRecorder();
2.2、設置音頻源 setAudioSource
//MIC 麥克風音頻源
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
可選的音頻源在 AudioSource
中有:
public final class AudioSource {
private AudioSource() {}
/** @hide */
public final static int AUDIO_SOURCE_INVALID = -1;
/** 默認音頻 **/
public static final int DEFAULT = 0;
/** 麥克風 */
public static final int MIC = 1;
/** Voice call uplink (Tx) audio source.
* 語音呼叫上行(Tx)音頻源
*/
public static final int VOICE_UPLINK = 2;
/** Voice call downlink (Rx) audio source.
* 語音呼叫下行(Rx)音頻源。
*/
public static final int VOICE_DOWNLINK = 3;
/** Voice call uplink + downlink audio source
* 語音通話上行+下行音頻源
*/
public static final int VOICE_CALL = 4;
/** Microphone audio source tuned for video recording, with the same orientation
* as the camera if available. */
public static final int CAMCORDER = 5;
/** 麥克風音頻源進行了語音識別. */
public static final int VOICE_RECOGNITION = 6;
/** Microphone audio source tuned for voice communications such as VoIP. It
* will for instance take advantage of echo cancellation or automatic gain control
* if available.
*/
public static final int VOICE_COMMUNICATION = 7;
/**
* 用於遠程呈現音頻流子混合的音頻源。
*/
@RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_OUTPUT)
public static final int REMOTE_SUBMIX = 8;
/** 麥克風原始音頻
* {@link #DEFAULT} otherwise. */
public static final int UNPROCESSED = 9;
/**
* Audio source for capturing broadcast radio tuner output.
* @hide
*/
@SystemApi
public static final int RADIO_TUNER = 1998;
/**
* Audio source for preemptible, low-priority software hotword detection
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_HOTWORD)
public static final int HOTWORD = 1999;
}
2.3、設置輸出格式: setOutputFormat
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
可選輸出格式有:
public final class OutputFormat {
private OutputFormat() {}
public static final int DEFAULT = 0;
/** 3GPP media file format*/
public static final int THREE_GPP = 1;
/** MPEG4 media file format*/
public static final int MPEG_4 = 2;
/** The following formats are audio only .aac or .amr formats */
/**
* AMR NB file format
* @deprecated Deprecated in favor of MediaRecorder.OutputFormat.AMR_NB
*/
public static final int RAW_AMR = 3;
/** AMR NB file format */
public static final int AMR_NB = 3;
/** AMR WB file format */
public static final int AMR_WB = 4;
/** @hide AAC ADIF file format */
public static final int AAC_ADIF = 5;
/** AAC ADTS file format */
public static final int AAC_ADTS = 6;
/** @hide Stream over a socket, limited to a single stream */
public static final int OUTPUT_FORMAT_RTP_AVP = 7;
/** H.264/AAC data encapsulated in MPEG2/TS */
public static final int MPEG_2_TS = 8;
/** VP8/VORBIS data in a WEBM container */
public static final int WEBM = 9;
};
2.4、設置輸出文件名 setOutputFile
String mFileName = getExternalCacheDir().getAbsolutePath() + "/audio_test.3gp";
mRecorder.setOutputFile(mFileName);
2.5、設置音頻編碼 setAudioEncoder
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
可選編碼有:
public final class AudioEncoder {
private AudioEncoder() {}
public static final int DEFAULT = 0;
/** AMR (Narrowband) audio codec */
public static final int AMR_NB = 1;
/** AMR (Wideband) audio codec */
public static final int AMR_WB = 2;
/** AAC Low Complexity (AAC-LC) audio codec */
public static final int AAC = 3;
/** High Efficiency AAC (HE-AAC) audio codec */
public static final int HE_AAC = 4;
/** Enhanced Low Delay AAC (AAC-ELD) audio codec */
public static final int AAC_ELD = 5;
/** Ogg Vorbis audio codec */
public static final int VORBIS = 6;
}
三、準備錄製(prepare()、start()
)
錄製前需要調用prepare()
方法
private void startRecord() {
mRecorder = new MediaRecorder();
//設置錄入音頻源
//MIC 麥克風音頻源
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) {
e.printStackTrace();
}
//開始錄製
mRecorder.start();
mRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() {
@Override
public void onError(MediaRecorder mr, int what, int extra) {
//mRecorder.reset();
Log.e("tag", "zzy: 錄製出錯");
}
});
}
四、停止錄製 stop()
mRecorder.stop();
五、播放音頻
播放的話可以找到錄製的文件進行播放,也可以使用MediaPlayer
進行播放
//初始化
MediaPlayer mPlayer;
mPlayer = new MediaPlayer();
mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mPlayer.start();
}
});
//點擊播放
mPlayer.setDataSource(mFileName);
mPlayer.prepareAsync();
MediaRecorder 用法還是很簡單的,更多的用例可以到官網上查看
參考: https://developer.android.google.cn/guide/topics/media/mediarecorder?hl=zh_cn