MediaRecorder和MediaCodec

MediaRecorder和MediaCodec都可以用来进行音视频录制。MediaRecorder是高层封装的结果,使用简单,可以快速实现标准录制功能。MediaCodec是底层编解码器API,提供了最大的灵活性,复杂度和维护成本也更高。

MediaRecorder

MediaRecorder实现了AudioRecordingMonitor,AudioRouting和MicrophoneDirection接口。
AudioRecordingMonitor主要用于监控音频录制过程中的状态变化,AudioRouting用于管理和查询音频路由路径,MicrophoneDirection用于控制音频采集的方向性和声场宽度。


MediaRecorder状态图

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 等配合使用,可以实现完整的音视频处理流水线

参考:

  1. MediaRecorder 概览
  2. MediaRecorder
  3. MediaCodec
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容