【问题标题】:Android MediaCodec dequeOutputBuffer always returns -1Android MediaCodec dequeOutputBuffer 总是返回 -1
【发布时间】:2012-09-10 18:21:40
【问题描述】:

我正在使用Jelly Bean 上的新MediaCodec API 来解码h264 stream。 使用开发者页面中的代码 sn-ps,按名称(取自 media_codec.xml)实例化解码器,传递表面并配置编解码器。

我面临的问题是,dequeOutputBuffer 总是返回 -1
尝试使用负超时无限等待,但没有运气。
每当我得到 -1 时,使用 getOutputBuffers 刷新缓冲区。

请注意,当使用自定义应用程序解析来自媒体源的数据并提供给解码器时,也会出现同样的问题。

上面的任何输入都会有所帮助

【问题讨论】:

  • 您能否发布您的代码。我很乐意进一步调试它
  • 媒体编解码器使用示例:bigflake.com/mediacodec

标签: android android-4.2-jelly-bean deque decoder android-mediacodec


【解决方案1】:

我也遇到过同样的问题。在每次调用时增加queueInputBuffer()presentationTimeUs 参数解决了这个问题。

例如, codec.queueInputBuffer(inputBufferIndex, 0, data.size, time, 0) time += 66 //incrementing by 1 works too

【讨论】:

    【解决方案2】:

    如果其他人在开始使用 MediaCodec 时遇到此问题(就像我今天所做的),请确保在完成后释放输出编解码器:

    mediaCodec.releaseOutputBuffer(index, render); 
    

    否则编解码器很快就会用完可用的缓冲区。

    【讨论】:

      【解决方案3】:

      在获取输出缓冲区中的数据之前,可能需要馈送多个输入缓冲区。

      【讨论】:

        【解决方案4】:

        -1 为INFO_TRY_AGAIN_LATER,表示输出缓冲区队列仍在准备中,您只需再次调用dequeueOutputBuffer即可。

        尝试在类似于ExoPlayer 的循环中使用调用dequeueOutputBuffer 的工作循环:

            while (drainOutputBuffer(positionUs, elapsedRealtimeUs)) {}
            if (feedInputBuffer(true)) {
              while (feedInputBuffer(false)) {}
            }
        

        其中 drainOutputBuffer 是一个调用 dequeueOutputBuffer 的方法。

        【讨论】:

          猜你喜欢
          • 2015-02-24
          • 1970-01-01
          • 1970-01-01
          • 2014-03-06
          • 2021-09-05
          • 2016-11-21
          • 2019-10-10
          • 2014-04-13
          • 2017-03-20
          相关资源
          最近更新 更多