v4l2 проблемы с веб-камерой, закодированной в H.264
Я пытаюсь отправить видео с веб-камеры H.264 через Wi-Fi на другой компьютер с помощью gstreamer. Я использую этот учебник в качестве руководства. Я использую Creative Live! Cam Connect HD в качестве моей веб-камеры. Сайт утверждает, что веб-камера имеет встроенный кодер H.264. Но когда я использовал v4l2-ctl, я получил следующее:
$ v4l2-ctl --list-formats
ioctl: VIDIOC_ENUM_FMT
...
Index : 1
Type : Video Capture
Pixel Format: 'MJPG' (compressed)
Name : MJPEG
Но когда я использую флаг --all, я получаю другой формат пикселей.
v4l2-ctl -d 1 --all
Driver Info (not using libv4l2):
Driver name : uvcvideo
Card type : Live! Cam Connect HD VF0750
Bus info : usb-0000:00:14.0-1
Driver version: 3.5.7
Capabilities : 0x04000001
Video Capture
Streaming
Format Video Capture:
Width/Height : 640/360
Pixel Format : 'YUYV'
Field : None
Bytes per Line: 1280
Size Image : 460800
Colorspace : SRGB
...
Я не уверен, почему я получаю два разных формата пикселей (MJPG и YUYV), но я ожидал увидеть формат пикселей: "H264" (сжатый), как в учебнике, с которым я связан.
Я использую Ubuntu 12.1 с версией ядра 3.5.0. Кто-нибудь знает, какие у меня проблемы? Я хотел бы использовать H.264 вместо этого на MJPG, чтобы сэкономить на пропускной способности. Есть идеи, почему он не обнаруживает H.264? Благодарю.
3 ответа
TL;DR: беги
v4l2-ctl --list-devices
чтобы проверить, перечисляет ли ваша камера несколько экземпляров. Поддержка H.264 может быть в одном из альтернативных экземпляров. На моей камере мне пришлось использовать /dev/video2 вместо video0.
Я получил эту камеру (USB-камера SVPRO с ручной фокусировкой и масштабированием, объектив 2,8–12 мм, 1080P HD, USB-веб-камера, 2 МП, слабое освещение, портативная USB-камера с датчиком Sony IMX322 и металлическим корпусом).
Он утверждает, что поддерживает H.264, но когда я запускаю
v4l2-ctl --list-formats-ext
Я получаю только форматы MJPG и YUYV.
# v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Index : 0
Type : Video Capture
Pixel Format: 'MJPG' (compressed)
Name : Motion-JPEG
Size: Discrete 1920x1080
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.067s (15.000 fps)
...
Index : 1
Type : Video Capture
Pixel Format: 'YUYV'
Name : YUYV 4:2:2
Size: Discrete 640x480
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.067s (15.000 fps)
...
Но потом я понял, что камера перечисляет несколько устройств:
# v4l2-ctl --list-devices
H264 USB Camera: USB Camera (usb-0000:00:14.0-3):
/dev/video0
/dev/video1
/dev/video2
/dev/video3
Судя по всему поддержка H.264 есть на видео2:
# v4l2-ctl -d2 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Index : 0
Type : Video Capture
Pixel Format: 'H264' (compressed)
Name : H.264
Size: Discrete 1920x1080
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Поэтому я подключил motion к использованию video2.
Я думаю, что проблема может быть в том, что Creative Live! Connect HD cam поддерживает только UVC1.1, который довольно устарел; так что, возможно, драйвер V4l2 не распознает его. См. Статью Википедии о поддерживаемых веб-камерах, поддерживаемых h.264.
Два разных формата пикселей (MJPG и YUYV) показывают, что камера может поддерживать эти форматы. MPEG для закодированных пакетов (обычно используется для отправки по сети на сторону получателя) и YUYV для изображения RAW (без сжатия), который обычно используется для локального просмотра. Однако вы можете использовать H.264 в VIDIOC_S_FMT, чтобы получить кодированный поток H.264.