我要做的是:使用Android的MediaCodec将原始PCM音频样本编码为原始AAC文件.
我遇到的问题:当我使用FFMPEG将生成的原始AAC文件打包到M4A容器中时,FFMPEG抱怨文件中缺少编解码器参数.
细节:
由于我找不到生成输出AAC文件的音频编码器的任何MediaCodec示例代码,我尝试将视频编码器修改为音频编码器.原始代码在这里:source_code
我配置了这样的音频编码器:
mEncoderFormat = MediaFormat.createAudioFormat("audio/mp4a-latm", (int)mAudioSampleRate, 2);
// redundant?
mEncoderFormat.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
mEncoderFormat.setInteger(MediaFormat.KEY_AAC_PROFILE,
MediaCodecInfo.CodecProfileLevel.AACObjectELD);
mEncoderFormat.setInteger(MediaFormat.KEY_SAMPLE_RATE, kSampleRates);
mEncoderFormat.setInteger(MediaFormat.KEY_BIT_RATE, kBitRates);
mEncoderFormat.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 2);
testEncoderWithFormat("audio/mp4a-latm", mEncoderFormat);
try {
codec.configure(
mEncoderFormat,
null /* surface */,
null /* crypto */,
MediaCodec.CONFIGURE_FLAG_ENCODE);
} catch (IllegalStateException e) {
Log.e(TAG, "codec '" + componentName + "' failed configuration.");
return;
}
Log.d(TAG, " testEncoder configured with format = " + format);
Run Code Online (Sandbox Code Playgroud)
然后我给编码器每帧提供10ms的PCM采样.编码器获取每个帧,生成一个比特流帧,然后将比特流写入FileOutputStream.循环一直持续到输入文件结束.
代码运行完成.我'adb pull'将生成的AAC文件从设备传送到我的PC,并使用FFMPEG来读取它.下面是命令和错误FFMPEG吐出:
$ ffmpeg -f aac -i BlessedNoColor_nexus7_api18.aac
ffmpeg version N-45739-g04bf2e7 …Run Code Online (Sandbox Code Playgroud)