Android 音频开发——AudioRecord录音
Android 音频开发——AudioTrack播放
Android 多媒体——MediaCodec编码AAC
MeidaCodec 官方地址:https://developer.android.google.cn/reference/android/media/MediaCodec
通过AudioRecord录制的音频数据(pcm格式),占用空间较大,消耗内存和磁盘,更不适合用于网络传输。而AAC是比较通用的压缩格式,这里整理下MeidaCodec编码AAC。
1. MediaCodec
MediaCodec类用于访问编码器、解码器组件。它是多媒体架构的一部分(通常与MediaExtractor
,MediaSync
,MediaMuxer
,MediaCrypto
, MediaDrm
,Image
,Surface
,AudioTrack
,AndroidRecord
一起使用)
简单说,编解码器处理输入数据以生成输出数据。MediaCodec异步处理数据,并使用一组输入和输出缓冲区。
流程:
- 请求(或接收)一个空的输入缓冲区;
- 将缓冲区填入数据;
- 将缓冲区加入队列;
- 编解码器处理输入数据,并将数据转换输出缓冲区;
- 请求(或接收)一个输出缓冲区;
- 获取输出缓冲区的数据;
- 释放输出缓冲区;
2. 处理方式
处理方式 | API版本<= 20 Jelly Bean / KitKat | API版本> = 21 Lollipop及更高版本 |
---|---|---|
使用缓冲区数组的同步API | 支持的 | 不推荐使用 |
使用缓冲区的同步API | 无法使用 | 支持的 |
使用缓冲区的异步API | 无法使用 | 支持的 |
使用缓冲区的异步处理
首选方法是通过在调用configure
之前设置回调来异步处理数据。如下示例:
MediaCodec codec = MediaCodec.createByCodecName(name);
MediaFormat mOutputFormat; // member variable
codec.setCallback(new MediaCodec.Callback() {
@Override
void onInputBufferAvailable(MediaCodec mc, int inputBufferId) {
ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferId);
// fill inputBuffer with valid data
…
codec.queueInputBuffer(inputBufferId, …);
}
@Override
void onOutputBufferAvailable(MediaCodec mc, int outputBufferId, …) {
ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferId);
MediaFormat bufferFormat = codec.getOutputFormat(outputBufferId); // option A
// bufferFormat is equivalent to mOutputFormat
// outputBuffer is ready to be processed or rendered.
…
codec.releaseOutputBuffer(outputBufferId, …);
}
@Override
void onOutputFormatChanged(MediaCodec mc, MediaFormat format) {
// Subsequent data will conform to new format.
// Can ignore if using getOutputFormat(outputBufferId)
mOutputFormat = format; // option B
}
@Override
void onError(…) {
…
}
});
codec.configure(format, …);
mOutputFormat = codec.getOutputFormat(); // option B
codec.start();
// wait for processing to complete
codec.stop();
codec.release();
使用缓冲区的同步处理
MediaCodec通常在同步模式下按以下方式使用
MediaCodec codec = MediaCodec.createByCodecName</