【问题标题】: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 刷新缓冲区。
请注意,当使用自定义应用程序解析来自媒体源的数据并提供给解码器时,也会出现同样的问题。
上面的任何输入都会有所帮助
【问题讨论】:
标签:
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 的方法。