编辑:
看起来问题在于此设备需要的尺寸不是16的倍数,而是32的倍数。问题是,我仍然不知道如何确定哪些设备有问题。它似乎使用了qcom(我曾在Android 4.X上看到过问题,但这是Android 5.1.1)。
我正在我的Android应用程序中对视频进行编码。 我正在使用Android MediaCodec进行转换,将每个帧的RGB转换为YUV并传递像素。
我使用的代码已经存在一段时间了,并且可以在我遇到的任何设备上使用。
一个用户向我报告了一个错误,即他们的MP4文件出现了奇怪的问题。该设备是Samsung T337A(Galaxy Tab 4)。
以下是MP4导出的外观:
注意 - 出现该问题的分辨率很奇怪。确认出现问题的分辨率为768x432和1280x720,但是例如640x352就没有问题(默认情况下,我的应用程序确保所有分辨率均可被16整除)。
在一个Nexus 5X上(也使用半平面YUV格式),输出适用于所有分辨率。
所以这是与该设备有关的问题,也许是其他我不知道的设备?
我查看了所有输出,它们看起来正常,并且与我之前提到的Nexus 5X完全一致(它始终能够工作)。
正在使用的MediaCodecInfo是OMX.qcom.video.encoder.avc,正在使用的颜色格式是2135033992(即COLOR_FormatYUV420Flexible)。 因此,没有什么奇怪的东西。
这段代码有点冗长,如果需要的话我会贴出来,但现在只是想了解为什么会发生这种情况。如果这种情况很普遍我就能理解,但同样的代码在大量其他设备上都可以工作,所以可能出了一些问题...
Image
对象中获取了Planes[]
,使用inputImage.getPlanes()
,然后获取每个单独的y、u、v平面。接着,我从u平面中获取strideplanes[1].getPixelStride
,它可以是1或2(平面或半平面),并且两者都被考虑并准确地适用于所有类型的设备。这个有一个stride为2,但是与其他的不同?不过,如果您不介意详细说明一下,“缓冲区偏移值”是什么意思呢?这可能是我需要的,谢谢! - yesbutmaybeno