我可以使用NDK AMediaCodec API成功解码AAC,但没有播放音频。
这是我的配置:
AMediaFormat_setString( format, AMEDIAFORMAT_KEY_MIME, "audio/mp4a-latm" );
AMediaFormat_setInt32( format, AMEDIAFORMAT_KEY_CHANNEL_COUNT, 2 );
AMediaFormat_setInt32( format, AMEDIAFORMAT_KEY_SAMPLE_RATE, 44100 );
AMediaFormat_setInt32( format, AMEDIAFORMAT_KEY_IS_ADTS, 0 );
uint8_t es[2] = { 0x12, 0x12 };
AMediaFormat_setBuffer( format, "csd-0", es, 2 );
这就是我要做的解码:
ssize_t inputIndex = AMediaCodec_dequeueInputBuffer( decoder, kInputTimeout );
uint8_t* inputBuf = AMediaCodec_getInputBuffer( decoder, inputIndex, &inputSize );
// Copy AAC data into inputBuf ...
AMediaCodec_queueInputBuffer( decoder, inputIndex, 0, aacSize, pts, 0 );
ssize_t outputIndex = AMediaCodec_dequeueOutputBuffer( decoder, &outputBufferInfo, kOutputTimeout );
if( outputIndex >= 0 )
{
AMediaCodec_releaseOutputBuffer( decoder, outputIndex, true );
}
我没有收到任何错误,outputBufferInfo.presentationTimeUs
正在适当更新,所以它似乎正在解码。但是没有输出音频。 releaseOutputBuffer
为音频执行此操作是否正确?我已经尝试将render
布尔参数设置为true
和false
,但我对两者都保持沉默。
MediaCodec
输出的音频是否与视频相同?
答案 0 :(得分:2)
不,MediaCodec不会自动呈现音频 - releaseOutputBuffer的渲染参数不会为音频做任何事情。 (有关这些问题的更多解释,请参阅MediaCodec类的Java文档,NDK文档中可能缺少这些解释。)
您需要手动获取已解码的输出缓冲区并将其提供给AudioTrack或OpenSL ES才能播放。