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

标签 android audio android-ndk aac android-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 bool 参数设置为 truefalse 但我对两者都保持沉默。

MediaCodec 是否像视频一样输出音频?

最佳答案

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

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

关于android - MediaCodec 在 Android 上解码 AAC 音频 - 解码但听不到任何输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27449632/

相关文章:

layout - 单击前是否有带有可见列的滑动菜单?

android - 有没有一种方法可以在运行时查询给定设备恰好正在使用哪个布局文件夹?

java - 如何调用从 native 代码返回 char[] 的 Java 方法?

android - 在 Android 中动态加载 C++ 库

java - 需要一些帮助把一些东西从绳子上拿下来

android - 线程之间的数据库冲突

jquery - 视频播放完毕后,开始播放音频吗?

java - Android 音频流的 UDP 或 TCP

audio - Corona Lua波形声音合成

android - Android NDK 暂停/恢复中的 hello-gl2 示例是否正确?