Конфигурация устройства v4l2loopback Маркер конца кадра
Моя установка заключается в том, что я записываю поток изображений с камеры, используя специальный драйвер (C++), который устанавливает устройство v4l2loopback и записывает в него необработанные данные изображения BGRA. Я установил устройство v4l2loopback с
struct v4l2_format v;
v.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
ioctl(m_v4l2_device.fd, VIDIOC_G_FMT, &v);
v.fmt.pix.width = resolution[0];
v.fmt.pix.height = resolution[1];
v.fmt.pix.pixelformat = V4L2_PIX_FMT_ABGR32;
v.fmt.pix.sizeimage = v.fmt.pix.width * v.fmt.pix.height * 4;
ioctl(m_v4l2_device.fd, VIDIOC_S_FMT, &v);
(Я упустил проверку ошибок для краткости) и установите частоту кадров, написав /sys/devices/virtual/video4linux/video22/format
(советы по установке этого значения в структуре v4l2_format приветствуются).
Затем я записываю данные изображения на устройство v4l2loopback с
write(m_v4l2_device.fd, frame.data.data(), frame.data.size())
где m_v4l2_device.fd
является файловым дескриптором устройства, а frame.data является std::vector<unsigned char>
содержащий изображение.
Свойства устройства v4l2loopback, о которых сообщает v4l2-ctl:
> v4l2-ctl -d /dev/video_QX --all
Driver Info (not using libv4l2):
Driver name : v4l2 loopback
Card type : Dummy video device (0x0001)
Bus info : platform:v4l2loopback-001
Driver version: 4.9.59
Capabilities : 0x85208003
Video Capture
Video Output
Video Memory-to-Memory
Read/Write
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x85208003
Video Capture
Video Output
Video Memory-to-Memory
Read/Write
Streaming
Extended Pix Format
Device Capabilities
Priority: 0
Video input : 0 (loopback: ok)
Video output: 0 (loopback in)
Format Video Capture:
Width/Height : 1024/768
Pixel Format : 'BGR4'
Field : None
Bytes per Line : 4096
Size Image : 3145728
Colorspace : sRGB
Transfer Function : Default
YCbCr/HSV Encoding: Default
Quantization : Default
Flags :
Format Video Output:
Width/Height : 1024/768
Pixel Format : 'BGR4'
Field : None
Bytes per Line : 4096
Size Image : 3145728
Colorspace : sRGB
Transfer Function : Default
YCbCr/HSV Encoding: Default
Quantization : Default
Flags :
Streaming Parameters Video Capture:
Frames per second: 25.000 (25/1)
Read buffers : 8
Streaming Parameters Video Output:
Frames per second: 25.000 (25/1)
Write buffers : 8
User Controls
keep_format (bool) : default=0 value=0
sustain_framerate (bool) : default=0 value=0
timeout (int) : min=0 max=100000 step=1 default=0 value=0
timeout_image_io (bool) : default=0 value=0
Используя gstreamer с v4l2src, я могу транслировать видео с устройства в кадровый буфер, однако gstreamer настаивает на том, что исходный формат - BGRx, а не BGRA (оба, похоже, соответствуют пиксельному формату BGR4 в v4l2-ctl) и тратит время на его "преобразование". Поэтому вместо этого я хочу использовать v4l2-ctl для потоковой передачи данных непосредственно между устройством v4l2loopback и кадровым буфером. Тем не менее, когда я пытаюсь, первый кадр выглядит нормально, но потом я получаю много строк
<4096 != 3145728
Тестирование с записью одного кадра в файл дает
> v4l2-ctl -d /dev/video_QX --stream-mmap=3 --stream-count=1 --stream-to=/tmp/delme
<<<<<<<<<<<<<<<<<<<<<<<<<< 24.50 fps
<<<<<<<<<<<<<<<<<<<<<<<< 24.37 fps
<<<^C
> ls -lh /tmp/delme
-rw-r--r-- 1 pi pi 177M des. 22 12:05 /tmp/delme
так что мне кажется, что причина моей проблемы в том, что --stream-count=1
Параметр, похоже, не оказывает влияния. Поскольку этот параметр работает для других устройств v4l2 (без обратной связи), я предполагаю, что мне не удалось установить какой-либо параметр где-либо при настройке устройства v4l2loopback. Может кто-нибудь сказать мне, какой параметр это может быть и как его установить? Спасибо!