c++ - 将像素格式从 CVPixelBuffer 映射到它们的等效 V4L

标签 c++ objective-c macos video v4l

我需要将 CVPixelBuffer.h 中列举的一系列 OSX CoreVideo 像素格式映射到它们在 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 通常可以互换使用。根据 Wikipedia ,

The scope of the terms Y'UV, YUV, YCbCr, YPbPr, etc., is sometimes ambiguous and overlapping. Historically, the terms YUV and Y'UV were used for a specific analog encoding of color information in television systems, while YCbCr was used for digital encoding of color information suited for video and still-image compression and transmission such as MPEG and JPEG. Today, the term YUV is commonly used in the computer industry to describe file-formats that are encoded using YCbCr.

V4L 还有 excellent documentation其像素格式,这有助于将 CVPixelBuffer.h 中的注释与 V4L 格式相匹配。

您特别询问了 kCVPixelFormatType_422YpCbCr8 将映射到什么。根据此信息,它应该映射到 V4L2_PIX_FMT_UYVY。下面是使用此信息构建的核心视频像素格式到 V4L 格式的映射。如果表格中没有显示某种格式,则意味着这两个库都不支持它。此信息并非基于任何实际测试,因此可能不正确。

请注意,两个库之间似乎只有 8 位格式通用。即使在它们似乎支持相同的 16 位或 32 位格式的情况下,由于端序差异,它们也不支持。例如,kCVPixelFormatType_16Gray 不映射到 V4L2_PIX_FMT_Y16,因为前者是大端,后者是小端。

|核心视频 |视频4Linux | | 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 | | kCV像素格式类型_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 版本包含一个大端头,其中包含平面所在的位置以及每个平面每行的字节数。 V4L 版本没有这个,所以你必须删除它才能从 CoreVideo 转到 V4L,添加它才能从 V4L 转到 Core Video。

关于c++ - 将像素格式从 CVPixelBuffer 映射到它们的等效 V4L,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23341820/

相关文章:

c++ - 如何: derived member in derived class with derived class specific methods

c++ - 带 CDB 的 QtCreator 3 在调试器中显示错误值

iOS 分段上传照片

ios - 如何从现有的 iPhone 项目中删除 Storyboard

java - OpenGL 版本在 ContextAttribs() 值更改时更改

c++ - T 为 QPointF 时的模板转换运算符

c++ - 缓慢的文件读取和复制到内存中 - C++

objective-c - cocoa 为 os x 10.11 构建,支持 NSTouchbar

php - 为什么这个正则表达式在 Ubuntu 上传递,但在 Mac OS X 上不传递

macos - 在 OS X 上使用 Pygame 进行错误的颜色抗锯齿