MediaRecorder和MediaCodec都可以用来进行音视频录制。MediaRecorder是高层封装的结果,使用简单,可以快速实现标准录制功能。MediaCodec是底层编解码器API,提供了最大的灵活性,复杂度和维护成本也更高。
MediaRecorder
MediaRecorder实现了AudioRecordingMonitor,AudioRouting和MicrophoneDirection接口。
AudioRecordingMonitor主要用于监控音频录制过程中的状态变化,AudioRouting用于管理和查询音频路由路径,MicrophoneDirection用于控制音频采集的方向性和声场宽度。

MediaRecorder基本使用如下,这里是录音的逻辑。
MediaRecorder recorder = new MediaRecorder(context);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(PATH_NAME);
recorder.prepare();
recorder.start(); // Recording is now started
...
recorder.stop();
recorder.reset(); // You can reuse the object by going back to setAudioSource() step
recorder.release(); // Now the object cannot be reused
MediaRecorder.AudioSource用于定义音频采集的源类型,对应常量如下:
┌─────────────────────────┬──────────┬─────────────────────────────────────┐
│ 常量 │ 值 │ 说明 │
├─────────────────────────┼──────────┼─────────────────────────────────────┤
│ DEFAULT │ 0 │ 默认源,由系统选择,通常等同 MIC │
│ MIC │ 1 │ 麦克风源,采集所有环境声音 │
│ VOICE_UPLINK │ 2 │ 上行链路,采集你说话的声音(通话中) │
│ VOICE_DOWNLINK │ 3 │ 下行链路,采集对方说话的声音(通话中) │
│ VOICE_CALL │ 4 │ 双向通话,采集双方声音(通话中) │
│ CAMCORDER │ 5 │ 摄像模式,针对视频录制优化 │
│ VOICE_RECOGNITION │ 6 │ 语音识别,启用降噪等处理 │
│ VOICE_COMMUNICATION │ 7 │ 语音通信,针对VoIP场景优化 │
│ REMOTE_SUBMIX │ 8 │ 远程混音,采集系统播放音频(需权限) │
│ UNPROCESSED │ 9 │ 未处理源,获取原始硬件数据(API 24+) │
│ VOICE_PERFORMANCE │ 10 │ 高性能语音,低延迟优化(API 29+) │
│ ECHO_REFERENCE │ 1997 │ 回声参考信号,用于AEC │
└─────────────────────────┴──────────┴─────────────────────────────────────┘
MediaRecorder.AudioEncoder 是 一个枚举类(包含整数常量的内部类),用于指定音频编码器类型。它决定了录音数据在写入文件前采用哪种压缩算法进行编码。
| 常量 | 值 | 说明 |
|---|---|---|
| DEFAULT | 0 | 默认编码器,由系统自动选择 |
| AMR_NB | 1 | AMR 窄带,8kHz,适合语音 |
| AMR_WB | 2 | AMR 宽带,16kHz,语音质量更佳 |
| AAC | 3 | AAC 编码,通用性最强 |
| HE_AAC | 5 | 高效率 AAC,低码率表现优异 |
| AAC_ELD | 6 | AAC 增强型低延迟,适合实时通信 |
| VORBIS | 7 | Vorbis 编码,开源 |
| OPUS | 8 | Opus 编码,全频段低延迟 |
必须先调用 setOutputFormat(),再调用 setAudioEncoder()
AudioEncoder 决定了最终录音文件的压缩格式,直接影响文件大小、音质和兼容性。
MediaRecorder.OutputFormat 是一个枚举类(包含整数常量的内部类),用于指定录音/录像输出文件的容器格式。它决定了音频(和视频)数据以何种封装格式写入文件。
| 常量 | 值 | 说明 |
|---|---|---|
| DEFAULT | 0 | 默认格式,由系统自动选择 |
| THREE_GPP | 1 | 3GP 容器格式,适合移动设备 |
| MPEG_4 | 2 | MP4 容器格式,通用性最强 |
| RAW_AMR | 3 | 原始 AMR 格式,仅 AMR 音频 |
| AMR_NB | 3 | AMR 窄带原始格式(同 RAW_AMR) |
| AMR_WB | 4 | AMR 宽带原始格式(API 5+) |
| AAC_ADIF | 5 | AAC ADIF 格式(API 10+) |
| AAC_ADTS | 6 | AAC ADTS 格式(API 10+) |
| OUTPUT_FORMAT_RTP_AVP | 7 | RTP 封装格式(API 24+) |
| OUTPUT_FORMAT_MPEG2TS | 8 | MPEG2 传输流(API 24+) |
| OUTPUT_FORMAT_WEBM | 9 | WebM 容器格式(API 28+) |
OutputFormat 决定了录音文件的外壳(容器),而 AudioEncoder 决定了外壳里装的内容(压缩格式)。两者必须兼容才能生成有效的文件。
MediaCodec

MediaCodec 是 Android 中用于低级别音频/视频编解码的核心类。
主要功能
编码(Encoding):将原始数据(如 PCM 音频、YUV 视频)压缩为指定格式(如 AAC、H.264)
解码(Decoding):将压缩数据解压为原始格式供播放或处理
硬件加速:利用设备上的专用 DSP/GPU 硬件进行高效编解码
// 1. 创建编码器/解码器
MediaCodec codec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_AUDIO_AAC);
// 或 MediaCodec.createDecoderByType(type);
// 2. 配置参数
MediaFormat format = new MediaFormat();
format.setString(MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_AUDIO_AAC);
format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100);
format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 2);
format.setInteger(MediaFormat.KEY_BIT_RATE, 128000);
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
// 3. 启动编解码器
codec.start();
// 4. 处理数据(异步模式示例)
codec.setCallback(new MediaCodec.Callback() {
@Override
public void onInputBufferAvailable(MediaCodec codec, int index) {
ByteBuffer buffer = codec.getInputBuffer(index);
// 写入待编码的数据
codec.queueInputBuffer(index, 0, dataSize, presentationTimeUs, 0);
}
@Override
public void onOutputBufferAvailable(MediaCodec codec, int index, BufferInfo info) {
ByteBuffer buffer = codec.getOutputBuffer(index);
// 处理编码后的数据
codec.releaseOutputBuffer(index, false);
}
@Override
public void onError(MediaCodec codec, MediaCodec.CodecException e) { }
@Override
public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) { }
});
// 5. 停止并释放资源
codec.stop();
codec.release();
常用编码类型(MIME)
| MIME 类型 | 说明 | 使用场景 |
|---|---|---|
| audio/aac | AAC 音频编码 | 音乐、通用音频 |
| audio/mp4a-latm | AAC-LATM 格式 | MP4 容器中的 AAC |
| audio/amr-wb | AMR 宽带 | 语音通话 |
| audio/amr-nb | AMR 窄带 | 语音录音 |
| audio/opus | Opus 编码 | VoIP、高质量语音 |
| audio/mpeg | MP3 编码 | 通用音频播放 |
| video/avc | H.264 视频编码 | 通用视频录制 |
| video/hevc | H.265 视频编码 | 4K/8K 视频 |
| video/vp8 | WebM 视频编码 | 开源视频格式 |
| video/vp9 | WebM 视频编码 | 开源视频格式(更高压缩率) |
简单理解
MediaRecorder = 傻瓜相机(一键录制,开箱即用)
MediaCodec = 专业单反(可调所有参数,自由组合处理链路)
MediaCodec 是构建高级多媒体应用的基础组件,与 MediaExtractor(解封装)、MediaMuxer(封装)、AudioRecord/AudioTrack 等配合使用,可以实现完整的音视频处理流水线
参考: