所有手机都支持 h.264 编码器中的 YUV 420 (Semi) Planar 颜色格式吗?

Will all phones support YUV 420 (Semi) Planar color format in h.264 encoder?

序言:这听起来像是一个非常具体的问题,但这实际上是使用兼容的 MediaCodec 构建 API 16+ Android 应用程序的可行/不可行大多数 phone.

我有一个带有 h.264 MediaCodec 的应用程序,它从缓冲区接收数据,而不是表面,因为我对图像进行了大量操作。创建 Encoder 时,我遍历 phone 中可能的编码器列表,以确保我使用的是专有编码器(如果有的话)。这部分没问题。

问题在于每个编码器都有其颜色格式偏好。这可能会导致在编码之前进行颜色格式转换。例如,在我的概念验证中,我包含了转换为 NV12NV21YV12 的方法,以及遵循非常严格的规则,例如放置一些平面的起点 /在缓冲区中精确偏移的交错平面等。仅仅能够使编码的视频看起来不错可能是一个很长的故事。

所以,如果我确定 Android h.264 MediaCodec 编码器正在接受什么标准,那么这将限制我必须进行的定制量使我的 API 16 MediaCodec 概念验证在所有设备上运行。

[编辑]

哦。我刚刚看到在 Android 18 之前创建输入表面是不可能的。我将不得不依赖于检测每种情况下的专有编解码器和颜色格式、随机崩溃、缓慢的 FPS 等。Bwe...有点很有可能,在 2017 年或 2018 年,将有足够多的设备具有相关 API 功能,可以使用 MediaCodec 编写像样的应用程序。

真正简短的回答是:不。

从 Android 4.3 开始,有一个 CTS 测试可验证设备是否支持 420 平面或 420 半平面输入 - 最重要的是,它以与其他设备相同的方式解释它。

实际上,Android 4.1 中的大多数设备确实以一种或另一种形式支持平面或半平面,但是您需要解决很多问题,这些问题特定于不同的设备和芯片组。一些编码器(一堆三星 Exynos 设备)宣传半平面,但通过与其他设备(和参考)相比交换的色度分量来解释它。一些编码器(还有三星 Exynos)宣传平面但将其解释为专有的平铺格式(或崩溃)。一些编码器 (Qualcomm) 假设亮度和色度平面之间有额外对齐。

有关您可能遇到的问题的更多详细信息,请参阅 https://code.google.com/p/android/issues/detail?id=37769。在实践中,您可能可以让它在大量设备上运行,但您需要或多或少地对每个设备进行验证,并为每个设备启用不同的怪癖解决方法。