我需要将列举的一系列 OSX CoreVideo 像素格式映射CVPixelBuffer.h
到V4L
. 例如,kCVPixelFormatType_24RGB
将映射到V4L2_PIX_FMT_RGB24
.
我尝试使用 匹配fourcc
,但 OSX 和 V4L 的定义不匹配。除了检查它们的确切布局并手动匹配它们之外,还有一种编程方式或信息表可以告诉我例如kCVPixelFormatType_422YpCbCr8
映射到哪里?
我需要将列举的一系列 OSX CoreVideo 像素格式映射CVPixelBuffer.h
到V4L
. 例如,kCVPixelFormatType_24RGB
将映射到V4L2_PIX_FMT_RGB24
.
我尝试使用 匹配fourcc
,但 OSX 和 V4L 的定义不匹配。除了检查它们的确切布局并手动匹配它们之外,还有一种编程方式或信息表可以告诉我例如kCVPixelFormatType_422YpCbCr8
映射到哪里?
Core Video 绝对不是为了与非 Apple 系统互操作而设计的,而且 Core Video 兼容性从来都不是 V4L 的目标,所以有些像素格式只存在于一个库中。一些格式,如 RGB24,两者都存在,因为它们是 Linux 和 OS X/iOS 都需要处理的常见格式。要确认两种像素格式是否相同,您需要预期它们的布局并手动匹配它们。两个库中都没有函数可以为您进行映射。
也就是说,CVPixelBuffer.h 和 videodev2.h 中有相当不错的注释,可以让您自信地匹配像素格式。映射某些格式的关键是要了解 YUV 和 Y'CbCr 经常互换使用。根据维基百科,
Y'UV、YUV、YCbCr、YPbPr 等术语的范围有时是模棱两可和重叠的。从历史上看,术语 YUV 和 Y'UV 用于电视系统中颜色信息的特定模拟编码,而 YCbCr 用于适用于视频和静止图像压缩和传输的颜色信息的数字编码,例如 MPEG 和 JPEG。今天,YUV 一词在计算机行业中常用来描述使用 YCbCr 编码的文件格式。
V4L 也有关于其像素格式的优秀文档,这有助于将 CVPixelBuffer.h 中的注释与 V4L 格式相匹配。
你特别问kCVPixelFormatType_422YpCbCr8
会映射到什么。鉴于此信息,它应该映射到V4L2_PIX_FMT_UYVY
. 下面是使用此信息构建的核心视频像素格式到 V4L 格式的映射。如果表格中未显示某种格式,则表示两个库均不支持该格式。此信息并非基于任何实际测试,因此可能不正确。
请注意,这两个库之间似乎只有 8 位格式是通用的。即使在它们似乎支持相同的 16 位或 32 位格式的情况下,它们也不是由于字节序差异。例如,kCVPixelFormatType_16Gray
不映射到V4L2_PIX_FMT_Y16
,因为前者是大端,而后者是小端。
| Core Video | Video4Linux |
| kCVPixelFormatType_16BE555 | V4L2_PIX_FMT_RGB555X |
| kCVPixelFormatType_16LE555 | V4L2_PIX_FMT_RGB555 |
| kCVPixelFormatType_16BE565 | V4L2_PIX_FMT_RGB565X |
| kCVPixelFormatType_16LE565 | V4L2_PIX_FMT_RGB565 |
| kCVPixelFormatType_24RGB | V4L2_PIX_FMT_RGB24 |
| kCVPixelFormatType_24BGR | V4L2_PIX_FMT_BGR24 |
| kCVPixelFormatType_32ARGB | V4L2_PIX_FMT_RGB32 |
| kCVPixelFormatType_32BGRA | V4L2_PIX_FMT_BGR32 |
| kCVPixelFormatType_422YpCbCr8 | V4L2_PIX_FMT_UYVY |
| kCVPixelFormatType_420YpCbCr8Planar* | V4L2_PIX_FMT_YUV420 |
| kCVPixelFormatType_422YpCbCr8_yuvs | V4L2_PIX_FMT_YUYV |
* Core Video 版本包含一个 big-endian 标头,其中包含平面所在的位置以及每个平面每行有多少字节。V4L 版本没有这个,所以你必须删除它才能从 CoreVideo 转到 V4L,并添加它才能从 V4L 转到 Core Video。