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

时间:2015-07-09 15:19:02

标签: android mediacodec

我正在通过MediaCodec处理实时流,并且有一个场景,其中MediaFormat在流中改变(即:正在解码的视频的分辨率发生变化)。鉴于我正在将解码器附加到Surface以便在我检测到传入流的分辨率变化时立即渲染它,然后在向其提供新的分辨率缓冲区之前重新创建解码器(为其提供适当的新MediaFormat 1}})。

我一直在收到一些奇怪的错误,这些错误并没有给我太多关于可能出错的信息,即用新格式和MediaCodec.configure调用Surface时:

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...

2 个答案:

答案 0 :(得分:3)

看起来调用stop()release()以及重新初始化我对getInputBuffers()getOutputBuffers()所做的任何引用都是有效的。至少我不再得到消息/例外。现在我只需要找出Surface参考部分,因为看起来调整大小的流(当分辨率变化时)仍然适合原始表面尺寸,而不是调整Surface的新分辨率。

答案 1 :(得分:0)

如果您的编码器支持自适应播放,那么显然您可以动态更改一些编解码器参数:

https://stackoverflow.com/a/34427724/1048170