Android MediaCodec Format/Resolution Change 中流

标签 android android-mediacodec

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

我遇到了一些奇怪的错误,这些错误并没有给我太多关于可能出错的信息,即当调用 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...

最佳答案

看起来像调用 stop()release() 以及重新初始化我对 getInputBuffers() 的任何引用>getOutputBuffers() 成功了。至少我不再收到消息/异常。现在我只需要弄清楚 Surface 引用部分,因为看起来调整大小的流(当分辨率发生变化时)仍然适合原始表面尺寸,而不是为新分辨率调整表面。

关于Android MediaCodec Format/Resolution Change 中流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31321685/

相关文章:

android - 当复选框改变状态时如何做某事?

android - Room 不向数据库插入数据

android - Android 中带有混淆器的 Crittercism

android - 如何在 Android 应用程序中同步 Google 电子表格并从中读取行

Android:使用 MediaExtractor 和 MediaCodec 获取当前位置

android - 无法使用 MediaMuxer 混合音频文件和视频文件?

android - [android]使用mediacodec和ffmpeg生成.ts文件,但是生成的ts文件没有图片覆盖

android - "visibility"在 Activity 生命周期中指的是什么? onPause vs onStop?

java - MediaCodec H264 编码器不适用于 Snapdragon 800 设备

android - 我想将 Pre-Rolls 附加到在 Android 设备上拍摄的视频