【问题标题】:MediaCodec decoding to buffer does not work while decoding to surface worksMediaCodec 解码到缓冲区不起作用,而解码到表面工作
【发布时间】:2015-01-20 00:47:49
【问题描述】:

应用的视频解码代码是典型的,就像MediaCodec document中的示例代码一样。没什么特别的。配置语句如下:

myMediaCodec.configure(myMediaFormat, mySurface, null, 0);

一切正常。但是,如果我将上面的代码更改为以下代码以将视频解码为缓冲区而不是表面:

myMediaCodec.configure(myMediaFormat, null, null, 0);

然后是以下代码:

int iOutputBufferIndex = myMediaCodec.dequeueOutputBuffer(myBufferInfo, 100000);

将始终返回 MediaCodec.INFO_TRY_AGAIN_LATER。更奇怪的是,任何后续调用 myMediaCodec.stop() 或 myMediaCodec.release() 都会挂起(即,该调用永远不会返回或生成异常)。 这发生在通用 (AGPTek) 平板电脑(Allwinner A31S,1.5GHz Cortex A7 四核)上。在模拟器和另一台平板电脑(Asus Memo Pad)上,一切正常。

我正在寻求任何提示来帮助解决这个问题。

【问题讨论】:

  • FWIW,您可以找到有关 bigflake 的一些其他示例和信息(例如 bigflake.com/mediacodec/#EncodeDecodeTest)。有问题的设备上运行的是哪个版本的 Android?
  • 感谢您的提示。我一直在等待你的最终回应。 bigflake 是我检查的第一个地方,但不幸的是平板电脑运行在 Android 4.2.2 上,所以我无法运行测试。
  • 4.3 之前的设备存在已知问题。如果这是一个编解码器错误,我不会感到惊讶。
  • 基本问题是 Android 4.2 中唯一的 MediaCodec“测试”是 Youtube 和 Netflix 等应用程序。如果他们不这样做,代码路径就不会被执行,并且没有人注意到它们是否被破坏。但是,如果解码到 SurfaceView 有效,那么我希望解码到 SurfaceTexture 很有可能工作。它与解码到缓冲区时的失败方式相同吗?
  • 这听起来有点熟悉……也许是stackoverflow.com/questions/23643307/…?请注意,该问题也适用于 4.1/4.2 设备。

标签: android android-mediacodec


【解决方案1】:

在尝试此操作之前,您是否提供了一个输入缓冲区的数据,还是在dequeueInputBuffer 也阻塞或返回INFO_TRY_AGAIN_LATER 之前传递尽可能多的数据包?解码器可能仅在输入一个数据包后就不会输出数据(如果解码器有一些延迟),但如果它与 Suface 输出一起工作,它的行为可能与那里的行为相同。

如果这(将尽可能多的输入缓冲区排队)不起作用,我会说这听起来像是一个解码器错误。

【讨论】:

  • 感谢您的回复。就像使用表面一样,已经将数百个数据包馈送到解码器进行测试。我还认为这可能是一个解码器错误,并想知道是否有办法解决这个问题,至少可以防止它挂起。
猜你喜欢
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2017-09-15
  • 1970-01-01
相关资源
最近更新 更多