Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 是否所有手机都支持h.264编码器中的YUV 420(半)平面颜色格式?_Android_Android Mediacodec_Yuv_Encoder - Fatal编程技术网

Android 是否所有手机都支持h.264编码器中的YUV 420(半)平面颜色格式?

Android 是否所有手机都支持h.264编码器中的YUV 420(半)平面颜色格式?,android,android-mediacodec,yuv,encoder,Android,Android Mediacodec,Yuv,Encoder,序言:这听起来可能是一个非常具体的问题,但实际上这是一个使用与大多数手机兼容的MediaCodec构建API16+Android应用程序的可行/不可行的方法 我有一个带有h.264MediaCodec的应用程序,它从缓冲区接收数据,而不是表面,因为我对图像进行了大量操作。在创建编码器时,我会反复查看手机中可能的编码器列表,以确保我使用的是专有编码器(如果有的话)。这部分不是问题 问题是每个编码器都有其颜色格式首选项。这可能导致编码前的颜色格式转换。例如,在我的概念证明中,我包括了转换为NV12、

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

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

问题是每个编码器都有其颜色格式首选项。这可能导致编码前的颜色格式转换。例如,在我的概念证明中,我包括了转换为
NV12
NV21
YV12
的方法,以及以下非常严格的规则,如将一些平面/交错平面的起点放置在缓冲区中的精确偏移处等。仅仅能够使编码视频看起来良好可能是一个漫长的过程

因此,如果我确信Android
h.264
MediaCodec
编码器接受的是一个标准,那么这将极大地限制我在所有设备上实现API 16 MediaCodec概念验证所需的定制量

[编辑]


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

真正简短的答案是:不

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

实际上,安卓4.1中的大多数设备都以某种形式支持平面或半平面,但有许多怪癖需要解决,这些怪癖针对不同的设备和芯片组。一些编码器(一堆三星Exynos设备)宣传半平面,但与其他设备(和参考)相比,其色度组件被替换。一些编码器(也包括三星Exynos)宣传平面,但将其解释为专有的平铺格式(或崩溃)。一些编码器(高通公司)假设luma和色度平面之间存在额外的对齐


有关可能遇到的问题的更多详细信息,请参阅。实际上,您可能可以在大量设备上使用它,但您需要或多或少地对每个设备进行验证,并为每个设备启用不同的怪癖解决方案。

我假设您已经找到了这一点,您可以在这里找到旧的安卓兼容性定义文档。也可以回答你的问题。真的很有趣,我不知道这些CTS是从哪里来的。虽然我实际上在寻找一个确认,即大多数在API 16+上运行MediaCodec h.264编码器的手机能够接收YUV 420平面或YUV 420半平面帧。谢谢,这正是我需要听到的。那么,使用Surface编码是一种安全的跨设备解决方案吗?除了使用不同的着色器外,我不会对我的图像做任何事情。表面应该是安全的(但它出现在4.3中,并且经过了适当的CTS测试),但我个人没有太多使用过它,所以我没有经验分享,仅假设CTS测试有望避免损坏的设备发货。我使用BigFlake自定义类用于与API兼容