Android MediaCodec Format/Resolution 改变中流
Android MediaCodec Format/Resolution Change mid-stream
我正在通过 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()
的所有引用就成功了。至少我不再得到 messages/exceptions 了。现在我只需要弄清楚 Surface
参考部分,因为看起来调整大小的流(当分辨率改变时)仍然适合原始表面尺寸,而不是为新分辨率调整表面。
如果您的编码器支持自适应播放,那么显然您可以动态更改一些编解码器参数:
我正在通过 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()
的所有引用就成功了。至少我不再得到 messages/exceptions 了。现在我只需要弄清楚 Surface
参考部分,因为看起来调整大小的流(当分辨率改变时)仍然适合原始表面尺寸,而不是为新分辨率调整表面。
如果您的编码器支持自适应播放,那么显然您可以动态更改一些编解码器参数: