- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
序言:这听起来像是一个非常具体的问题,但这实际上是使用 MediaCodec 构建
与大多数手机兼容。API
16+ Android
应用程序的可行/不可行
我有一个带有 h.264
MediaCodec
的应用程序,它从缓冲区接收数据 - 而不是表面,因为我对图像进行了大量操作.创建 Encoder
时,我遍历手机中可能的编码器列表,以确保我使用的是专有编码器(如果有)。这部分没有问题。
问题在于每个编码器都有其颜色格式偏好。这可能会导致在编码之前进行颜色格式转换。例如,在我的概念验证中,我包含了转换为 NV12
、NV21
和 YV12
的方法,以及遵循非常严格的规则,比如将一些平面/交错平面的开始放置在缓冲区中的精确偏移处等。仅仅能够使编码视频看起来不错可能是一个很长的故事。
所以,如果我确定 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有关您可能遇到的问题的更多详细信息。在实践中,您可能可以让它在大量设备上运行,但您需要或多或少地对每个设备进行验证,并为每个设备启用不同的怪癖解决方法。
关于android - 所有手机都支持 h.264 编码器中的 YUV 420 (Semi) Planar 颜色格式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30857610/
在应用程序中我使用了 AVCaptureVideo。我得到了 kCVPixelFormatType_420YpCbCr8BiPlanarFullRange 格式的视频。 现在我从 imagebuffe
我从 SDK 获得像素格式为 BGR 的图像,即 BGRBGRBGR。对于另一个应用程序,我需要将此格式转换为 RGB 平面 RRRGGGBBB。我不想为此任务使用额外的库,因此我必须使用自己的代码在
序言:这听起来像是一个非常具体的问题,但这实际上是使用 MediaCodec 构建 API 16+ Android 应用程序的可行/不可行 与大多数手机兼容。 我有一个带有 h.264 MediaCo
我用 ffmpeg 录屏, 使用 avfoundation在 Mac OS X 上,x11grab在 Linux 和 gdigrab 上在 Windows 上。 生成的文件应该与现代 Web 浏览器
我是一名优秀的程序员,十分优秀!