【问题标题】:audio codec dequeueInputBuffer returns -1 on device音频编解码器 dequeueInputBuffer 在设备上返回 -1
【发布时间】:2015-05-07 12:42:57
【问题描述】:

我正在尝试播放一些从 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。

【问题讨论】:

标签: android audio android-mediacodec audiotrack mediaextractor


【解决方案1】:

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

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

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

【讨论】:

  • 是的,这有帮助。每次获得输入缓冲区时都应该调用Advance。通过这些更改,代码可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-20
  • 1970-01-01
相关资源
最近更新 更多