Android MediaCodec格式/分辨率更改中期

我正在通过MediaCodec处理实时流,并遇到MediaFormat在中间流更改的情况(即:正在解码的视频的分辨率发生变化).假设我将解码器附加到Surface上以在检测到输入流的分辨率变化后立即对其进行渲染,则在向其提供新的分辨率缓冲区(为它提供适当的新MediaFormat)之前,我会重新创建解码器.

我遇到了一些奇怪的错误,这些错误并没有给我太多有关可能出什么问题的信息,即在使用新格式和相同的Surface调用MediaCodec.configure时:

android.media.MediaCodec$CodecException: Error 0xffffffea
  at android.media.MediaCodec.native_configure(Native Method)
  at android.media.MediaCodec.configure(MediaCodec.java:577)

在获取CodecException.getDiagnosticInfo时,它什么都没显示出我可以真正用来理解失败原因的东西:android.media.MediaCodec.error_neg_22

我还注意到了日志中的以下内容,并找到了一些相关信息,并且想知道是否需要针对Surface本身做一些事情(例如将其与解码器的旧实例分离,将其交给新的).

07-09 15:00:17.217 E/BufferQueueProducer(  139): [SurfaceView] connect(P): already connected (cur=3 req=3)
07-09 15:00:17.217 E/MediaCodec( 5388): native_window_api_connect returned an error: Invalid argument (-22)
07-09 15:00:17.218 E/MediaCodec( 5388): configure failed with err 0xffffffea, resetting...

解决方法:

看起来像调用stop()和release()以及重新初始化我对getInputBuffers()和getOutputBuffers()的所有引用都可以达到目的.至少我没有收到消息/异常了.现在,我只需要弄清楚Surface参考零件,因为调整大小的流(当分辨率更改时)似乎仍然适合原始曲面尺寸,而不是针对新的分辨率调整Surface.

上一篇:曲面记录:颜色格式问题


下一篇:何时调用MediaCodec:getOutputFormat()?