gpt4 book ai didi

android - 音频编解码器dequeueInputBuffer在设备上返回-1

转载 作者:行者123 更新时间:2023-12-03 00:06:06 26 4
gpt4 key购买 nike

我正在尝试播放一些从MPEG2传输(.ts)文件中提取的音频。我通过MediaExtractor获取音频流,使用readSampleData将样本复制到MediaCodec输入缓冲区,然后将MediaCodec输出缓冲区写入AudioTrack。 MediaExtractor将音频MIME类型指示为“audio / mp4a-latm”。

所有这些都可以在Nexus 7 2013平板电脑上完美运行。

但是,它在廉价的Neutab x7平板电脑上根本无法工作。问题在于,经过几次采样后,dequeueInputBuffer重复返回-1。
注释掉对AudioTrack.write()的调用不会更改该事实,因此问题出在MediaCodec的操作上。

代码看起来像(记录日志,省略了一些错误处理):

  audioInputBufferIndex = audioCodec.dequeueInputBuffer(TIMEOUT);
if (audioInputBufferIndex >= 0) {
audioInputBuffers[audioInputBufferIndex].clear();
sampleSize = audioExtractor.readSampleData(audioInputBuffers[audioInputBufferIndex], 0);
audioPresentationTimeUs = audioExtractor.getSampleTime();
audioCodec.queueInputBuffer(audioInputBufferIndex,0,sampleSize,audioPresentationTimeUs,0);
audioOutputBufferIndex = audioCodec.dequeueOutputBuffer(audioBufferInfo, TIMEOUT);
if (audioOutputBufferIndex >= 0) {
ByteBuffer buffer = audioOutputBuffers[audioOutputBufferIndex];
byte[] chunk = new byte[audioBufferInfo.size];
buffer.get(chunk);
buffer.clear();
if (audioTrack != null & chunk.length > 0) {
audioTrack.write(chunk, 0, chunk.length);
audioExtractor.advance();
}
audioCodec.releaseOutputBuffer(audioOutputBufferIndex,false);
audioCodec配置有从 audioExtractor获得的MediaFormat。我尝试将TIMEOUT设置为较大的值,没有任何乐趣。

为什么此代码在这两个设备上的行为会有所不同?有旋钮可以转动吗?

Neutab上有一个“视频”应用程序可以很好地播放此文件。Logcat透露它也在使用MediaExtractor和AudioTrack,但显然没有使用MediaCodec。我在logcat中看到了Omx *条目,因此也许是直接使用libstagefright。

最佳答案

就我阅读的代码而言,每次设法将一个输入缓冲区排队时,您只会尝试使输出缓冲区出队一次。

请记住,解码器异步运行,并且具有有限数量的输入和输出缓冲区。即使解码器确实解码了您的输入缓冲区,输出也可能不会立即在输出缓冲区中提供。在这种情况下,增加TIMEOUT值可能会有所帮助,但不能保证。

尝试拆分两个if语句,以便即使dequeueOutputBuffer不返回任何缓冲区,也每次在循环中调用dequeueInputBuffer

关于android - 音频编解码器dequeueInputBuffer在设备上返回-1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28889837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com