MediaCodec在Android上解码AAC音频 - 解码但无法听到任何输出

时间:2014-12-12 18:13:31

标签: android audio android-ndk aac mediacodec

我可以使用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布尔参数设置为truefalse,但我对两者都保持沉默。

MediaCodec输出的音频是否与视频相同?

1 个答案:

答案 0 :(得分:2)

不,MediaCodec不会自动呈现音频 - releaseOutputBuffer的渲染参数不会为音频做任何事情。 (有关这些问题的更多解释,请参阅MediaCodec类的Java文档,NDK文档中可能缺少这些解释。)

您需要手动获取已解码的输出缓冲区并将其提供给AudioTrack或OpenSL ES才能播放。