Android MediaCodec编码器 - 三星设备出现奇怪结果

12

编辑:

看起来问题在于此设备需要的尺寸不是16的倍数,而是32的倍数。问题是,我仍然不知道如何确定哪些设备有问题。它似乎使用了qcom(我曾在Android 4.X上看到过问题,但这是Android 5.1.1)。


我正在我的Android应用程序中对视频进行编码。 我正在使用Android MediaCodec进行转换,将每个帧的RGB转换为YUV并传递像素。

我使用的代码已经存在一段时间了,并且可以在我遇到的任何设备上使用。

一个用户向我报告了一个错误,即他们的MP4文件出现了奇怪的问题。该设备是Samsung T337A(Galaxy Tab 4)。

以下是MP4导出的外观:

enter image description here

注意 - 出现该问题的分辨率很奇怪。确认出现问题的分辨率为768x432和1280x720,但是例如640x352就没有问题(默认情况下,我的应用程序确保所有分辨率均可被16整除)。

在一个Nexus 5X上(也使用半平面YUV格式),输出适用于所有分辨率。

所以这是与该设备有关的问题,也许是其他我不知道的设备?


我查看了所有输出,它们看起来正常,并且与我之前提到的Nexus 5X完全一致(它始终能够工作)。

正在使用的MediaCodecInfo是OMX.qcom.video.encoder.avc,正在使用的颜色格式是2135033992(即COLOR_FormatYUV420Flexible)。 因此,没有什么奇怪的东西。

这段代码有点冗长,如果需要的话我会贴出来,但现在只是想了解为什么会发生这种情况。如果这种情况很普遍我就能理解,但同样的代码在大量其他设备上都可以工作,所以可能出了一些问题...

1个回答

2

请确保使用正确的步幅和缓冲区偏移值


我从要渲染的Image对象中获取了Planes[],使用inputImage.getPlanes(),然后获取每个单独的y、u、v平面。接着,我从u平面中获取stride planes[1].getPixelStride,它可以是1或2(平面或半平面),并且两者都被考虑并准确地适用于所有类型的设备。这个有一个stride为2,但是与其他的不同?不过,如果您不介意详细说明一下,“缓冲区偏移值”是什么意思呢?这可能是我需要的,谢谢! - yesbutmaybeno
问题似乎是这个设备不需要16维的电源,而是需要32维的电源。问题在于,我仍然不知道如何确定哪些设备会引起问题。这似乎使用了qcom(我已经看到它在Android 4.X上存在问题,但这是Android 5.1.1)。 - yesbutmaybeno

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