Android MediaCodec 在流媒体过程中如何改变格式/分辨率

5
我正在使用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...

1
一些解码器支持“自适应播放”,允许在流媒体中更改分辨率。这是一个相对较新的功能(4.4?)。http://developer.android.com/reference/android/media/MediaCodec.html有一些注意事项。 - fadden
是的,不幸的是我正在使用的解码器(用于 video/avc)不支持它(至少在我测试的设备上不支持)。但知道这样的 API 存在还是很好的。 - Roberto Andrade
2个回答

3
看起来调用stop()release(),并重新初始化我对getInputBuffers()getOutputBuffers()的任何引用就可以解决问题了。至少我不再收到消息/异常了。现在我只需要弄清楚Surface引用部分,因为似乎被调整大小的流(当分辨率改变时)仍然适合原始表面尺寸,而不是调整表面以适应新分辨率。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接