我可以使用 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
bool 参数设置为 true
和 false
但我对两者都保持沉默。
MediaCodec
是否像视频一样输出音频?
最佳答案
不,MediaCodec 不会自动渲染音频 - releaseOutputBuffer 的渲染参数不会为音频做任何事情。 (有关这些问题的更多解释,请参阅 MediaCodec 类的 Java 文档,NDK 文档中可能缺少这些解释。)
您需要手动获取解码后的输出缓冲区并将其提供给 AudioTrack 或 OpenSL ES 以进行播放。
关于android - MediaCodec 在 Android 上解码 AAC 音频 - 解码但听不到任何输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27449632/