2

在用户空间应用程序中,我将 v210 格式的视频数据写入 V4L2 环回设备。当我在 VLC 或其他查看器中观看视频时,我只是得到小丑并声称流是 UYUV 或其他,而不是 v210。我怀疑我需要告诉环回设备比我拥有的更多的东西,以使流向查看器显示为 v210。还有其他地方/方式可以告诉它它将处理某种格式吗?

我现在应该做什么:

int frame_w, frame_h = ((some sane values))

outputfd = open("/dev/video4", O_RDWR); 
// check VIDIOC_QUERYCAPS, ...

struct v4l2_format fmt;
memset(&fmt, 0, sizeof(fmt));
fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
fmt.fmt.pix.width = frame_w;
fmt.fmt.pix.height = frame_h;
fmt.fmt.pix.bytesperline = inbpr;    // no padding
fmt.fmt.pix.field = 1;
fmt.fmt.pix.sizeimage = frame_h * fmt.fmt.pix.bytesperline;
fmt.fmt.pix.colorspace = V4L2_COLORSPACE_SRGB;

v210width = (((frame_w+47)/48)*48);  // round up to mult of 48 px
byte_per_row = (v210width*8)/3;       
fmt.fmt.pix.pixelformat = 'v' | '2' << 8 | '1' << 16 | '0' << 24;
fmt.fmt.pix.width = v210width;
fmt.fmt.pix.bytesperline = byte_per_row ;

ioctl(outputfd, VIDIOC_S_FMT, &fmt);

// later, in some inner loop...
... write stuff to uint8_t buffer[] ...
write(outputfd, buffer, buffersize);

如果我写 UYVY 格式,或 RGB 或其他格式,它可以工作。观看者显示视频并报告正确的格式。

此代码基于示例、阅读 V4L 文档和一些内部工作代码。这里没有人确切地知道打开和写入视频设备必须做的所有事情。

虽然网上有一个很容易找到的如何从 V4L 设备读取视频的示例,但我找不到类似质量的写作示例。如果存在这种情况,它可能会显示缺失的部分。

4

0 回答 0