LINUX.ORG.RU

Получить h264 из Logitech c920

 , ,


0

1

Моя цель: получить поток, кодированный в h264 из веб-камеры Logitech c920. Я примерно представляю, сколько раз разжевывался этот вопрос в интернетах, но ничего не получается. Что есть: Ubuntu 19.04 на ноуте Vaio SVS1513, собственно c920. Вывод v4l-ctl:

user@vaio:~$ v4l2-ctl --list-formats
ioctl: VIDIOC_ENUM_FMT
        Index       : 0
        Type        : Video Capture
        Pixel Format: 'YUYV'
        Name        : YUYV 4:2:2

        Index       : 1
        Type        : Video Capture
        Pixel Format: 'MJPG' (compressed)
        Name        : Motion-JPEG

user@vaio:~$ v4l2-ctl --all
Driver Info (not using libv4l2):
        Driver name   : uvcvideo
        Card type     : HD Pro Webcam C920
        Bus info      : usb-0000:00:14.0-3
        Driver version: 4.18.20
        Capabilities  : 0x84A00001
                Video Capture
                Metadata Capture
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps   : 0x04200001
                Video Capture
                Streaming
                Extended Pix Format
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
        Width/Height      : 800/600
        Pixel Format      : 'YUYV'
        Field             : None
        Bytes per Line    : 1600
        Size Image        : 960000
        Colorspace        : sRGB
        Transfer Function : Default (maps to sRGB)
        YCbCr/HSV Encoding: Default (maps to ITU-R 601)
        Quantization      : Default (maps to Limited Range)
        Flags             :
Crop Capability Video Capture:
        Bounds      : Left 0, Top 0, Width 800, Height 600
        Default     : Left 0, Top 0, Width 800, Height 600
        Pixel Aspect: 1/1
Selection: crop_default, Left 0, Top 0, Width 800, Height 600
Selection: crop_bounds, Left 0, Top 0, Width 800, Height 600
Streaming Parameters Video Capture:
        Capabilities     : timeperframe
        Frames per second: 24.000 (24/1)
        Read buffers     : 0
                     brightness 0x00980900 (int)    : min=0 max=255 step=1 default=128 value=128
                       contrast 0x00980901 (int)    : min=0 max=255 step=1 default=128 value=128
                     saturation 0x00980902 (int)    : min=0 max=255 step=1 default=128 value=128
 white_balance_temperature_auto 0x0098090c (bool)   : default=1 value=1
                           gain 0x00980913 (int)    : min=0 max=255 step=1 default=0 value=223
           power_line_frequency 0x00980918 (menu)   : min=0 max=2 default=2 value=2
      white_balance_temperature 0x0098091a (int)    : min=2000 max=6500 step=1 default=4000 value=3193 flags=inactive
                      sharpness 0x0098091b (int)    : min=0 max=255 step=1 default=128 value=128
         backlight_compensation 0x0098091c (int)    : min=0 max=1 step=1 default=0 value=0
                  exposure_auto 0x009a0901 (menu)   : min=0 max=3 default=3 value=3
              exposure_absolute 0x009a0902 (int)    : min=3 max=2047 step=1 default=250 value=415 flags=inactive
         exposure_auto_priority 0x009a0903 (bool)   : default=0 value=1
                   pan_absolute 0x009a0908 (int)    : min=-36000 max=36000 step=3600 default=0 value=0
                  tilt_absolute 0x009a0909 (int)    : min=-36000 max=36000 step=3600 default=0 value=0
                 focus_absolute 0x009a090a (int)    : min=0 max=250 step=5 default=0 value=30 flags=inactive
                     focus_auto 0x009a090c (bool)   : default=1 value=1
                  zoom_absolute 0x009a090d (int)    : min=100 max=500 step=1 default=100 value=100
user@vaio:~$ v4l2-ctl --list-devices
HD Pro Webcam C920 (usb-0000:00:14.0-3):
        /dev/video0
        /dev/video1

USB2.0 Camera: USB2.0 Camera (usb-0000:00:1a.0-1.3):
        /dev/video2
        /dev/video3

Дальше пытаюсь действовать по мануалу с хабра, но ни uvch264src, ни v4l2src, ни vlc не хотят работать с камерой в качестве источника h264.

cvlc:

user@vaio:~$ v4l2-ctl --device=/dev/video0 --set-fmt-video=width=800,height=600,pixelformat=1

user@vaio:~$ cvlc v4l2:///dev/video0:chroma=h264:width=800:height=600 --sout '#standard{access=http,mux=ts,dst=localhost:8080,name=stream,mime=video/ts}' -vvv
... skip ...

[00007fe8e0000c40] main input debug: `v4l2:///dev/video0:chroma=h264:width=800:height=600' successfully opened
[00007fe8e0000c40] main input debug: Buffering 0%
[00007fe8e0000c40] main input debug: switching to sync mode
[00007fe8dc0015e0] main stream output debug: adding a new sout input for `YUY2` (sout_input: 0x7fe8d4000b20)
[00007fe8dc005130] main mux debug: adding a new input
[00007fe8dc005130] mux_ts mux warning: rejecting stream with unsupported codec YUY2
[00007fe8dc005130] main mux error: cannot add this stream
[00007fe8dc0015e0] main stream output warning: new sout input failed (sout_input: 0x7fe8d4000b20)
[00007fe8dc4da2a0] main decoder error: cannot create packetizer output (YUY2)
... skip ...
Как я понял, это от несоответствия ожидаемого формата (h264) и получаемого фактически (raw YUY2).

uvch264src:

user@vaio:~$ gst-launch-1.0 -v -e uvch264src device=/dev/video0 name=src auto-start=true src.vfsrc ! queue ! video/x-raw,format=YUY2,width=320,height=240,framerate=10/1 ! xvimagesink sync=false src.vidsrc ! queue ! video/x-h264,width=1280,height=720,framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink sync=false
Установка конвейера в состояние PAUSED…
ОШИБКА: Конвейер не хочет становиться на паузу.
/GstV4l2Src:v4l2src0: num-buffers = -1
/GstV4l2Src:v4l2src0: device = /dev/video0
ОШИБКА: из элемента /GstPipeline:pipeline0/GstUvcH264Src:src: Device is not a valid UVC H264 camera
Дополнительная отладочная информация:
gstuvch264_src.c(2528): ensure_v4l2src (): /GstPipeline:pipeline0/GstUvcH264Src:src
Установка конвейера в состояние NULL…
Освобождение конвейера…

v4l2src:

user@vaio:~$ gst-launch-1.0 -v -e v4l2src device=/dev/video0 ! queue ! video/x-h264,width=1280,height=720,framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink sync=false
Установка конвейера в состояние PAUSED…
Конвейер работает и не требует состояния PREROLL…
Установка конвейера в состояние PLAYING…
New clock: GstSystemClock
ОШИБКА: из элемента /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Internal data stream error.
Дополнительная отладочная информация:
gstbasesrc.c(3055): gst_base_src_loop (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
streaming stopped, reason not-negotiated (-4)
Включён EOS при закрытии — ожидание EOS после ошибки
Ожидание EOS…
^Chandling interrupt.
Прерывание: Остановка конвейера…
Прерывание во время ожидания EOS — остановка конвейера…
Execution ended after 0:00:03.536119652
Установка конвейера в состояние PAUSED…
Установка конвейера в состояние READY…
Установка конвейера в состояние NULL…
Освобождение конвейера…
В интернетах говорят, что reason not-negotiated (-4) это опять же несоответствие ожидаемого и получаемого форматов.

ffmpeg я тоже пробовал, он тоже выдает два вида форматов - raw и mjpeg, а поскольку я не понял, исправлен ли баг со сбросом формата на raw при подключении к девайсу, то я сильно в эту сторону не копал.

Куда бечь, господа? Если я ничего не понял, c920 может показывать формат/пин/пад/яхз h264, а может не показывать, при этом упаковывая данные h264 в поток mjpeg. Во втором случае должен работать uvch264src, он для этого создавался (наверно). В первом должно работать вообще все, но нет. Как заставить c920 выдавать h264? Вариант кодировать извне мне не подходит, т.к. в итоге хочу получать поток на onion S2+, а там аппаратного кодека (или я о нем не знаю).

Ответ на: комментарий от Harald

Я видел на so комментарии счастливчиков, у которых тоже так показывает. Есть идеи, как заставить ее у меня так показывать? Кстати, я подключал ее к винде, а на винде, по слухам, есть два вида драйверов - у которых есть h264 и у которых нет (логитековские и виндовые). Не могла винда переключить ее в режим «кривого h264»? На винде она у меня тоже как источник h264 в directshow не видна.

leet27 ()
Ответ на: комментарий от Harald

Запросто.

user@vaio:~$ dmesg | tail -n 20
[   23.404513] random: crng init done
[   23.404516] random: 7 urandom warning(s) missed due to ratelimiting
[   52.354521] usb 3-2: new high-speed USB device number 2 using xhci_hcd
[   53.074067] usb 3-2: New USB device found, idVendor=046d, idProduct=0892, bcdDevice= 0.19
[   53.074071] usb 3-2: New USB device strings: Mfr=0, Product=2, SerialNumber=1
[   53.074074] usb 3-2: Product: HD Pro Webcam C920
[   53.074076] usb 3-2: SerialNumber: A5D97D2F
[   53.075006] uvcvideo: Found UVC 1.00 device HD Pro Webcam C920 (046d:0892)
[   53.076659] uvcvideo 3-2:1.0: Entity type for entity Processing 3 was not initialized!
[   53.076665] uvcvideo 3-2:1.0: Entity type for entity Extension 6 was not initialized!
[   53.076669] uvcvideo 3-2:1.0: Entity type for entity Extension 8 was not initialized!
[   53.076672] uvcvideo 3-2:1.0: Entity type for entity Extension 9 was not initialized!
[   53.076676] uvcvideo 3-2:1.0: Entity type for entity Extension 10 was not initialized!
[   53.076679] uvcvideo 3-2:1.0: Entity type for entity Extension 11 was not initialized!
[   53.076681] uvcvideo 3-2:1.0: Entity type for entity Extension 13 was not initialized!
[   53.076683] uvcvideo 3-2:1.0: Entity type for entity Camera 1 was not initialized!
[   53.076832] input: HD Pro Webcam C920 as /devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0/input/input14
[   53.097490] gspca_main: v2.14.0 registered
[   53.100279] usbcore: registered new interface driver vc032x
[   53.632563] usbcore: registered new interface driver snd-usb-audio

leet27 ()
Ответ на: комментарий от leet27
[2507309.598234] usb 3-8: new high-speed USB device number 10 using xhci_hcd
[2507311.971903] usb 3-8: New USB device found, idVendor=046d, idProduct=082d, bcdDevice= 0.11
[2507311.971905] usb 3-8: New USB device strings: Mfr=0, Product=2, SerialNumber=1
[2507311.971906] usb 3-8: Product: HD Pro Webcam C920
[2507311.971907] usb 3-8: SerialNumber: 217355AF
[2507311.972562] uvcvideo: Found UVC 1.00 device HD Pro Webcam C920 (046d:082d)
[2507311.973490] uvcvideo 3-8:1.0: Entity type for entity Processing 3 was not initialized!
[2507311.973491] uvcvideo 3-8:1.0: Entity type for entity Extension 6 was not initialized!
[2507311.973492] uvcvideo 3-8:1.0: Entity type for entity Extension 12 was not initialized!
[2507311.973493] uvcvideo 3-8:1.0: Entity type for entity Camera 1 was not initialized!
[2507311.973494] uvcvideo 3-8:1.0: Entity type for entity Extension 8 was not initialized!
[2507311.973495] uvcvideo 3-8:1.0: Entity type for entity Extension 9 was not initialized!
[2507311.973496] uvcvideo 3-8:1.0: Entity type for entity Extension 10 was not initialized!
[2507311.973497] uvcvideo 3-8:1.0: Entity type for entity Extension 11 was not initialized!
[2507311.973555] input: HD Pro Webcam C920 as /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/input/input15

-(046d:0892)

+(046d:082d)

product ID отличается

Harald ★★★★★ ()
Ответ на: комментарий от Deleted

Ну вообще по кодам нельзя однозначно судить о поддельности/оригинальности, сам производитель может выпускать много ревизий под одним названием

Harald ★★★★★ ()
Ответ на: комментарий от Harald

Насчет техподдержки мысль меня тоже посещала. Завтра проверю. А ты не мог бы показать вывод от vlc

v4l2-ctl --device=/dev/video0 --set-fmt-video=width=800,height=600,pixelformat=1

cvlc v4l2:///dev/video0:chroma=h264:width=800:height=600 --sout '#standard{access=http,mux=ts,dst=localhost:8080,name=stream,mime=video/ts}' -vvv

и через gst

gst-launch-1.0 -v -e v4l2src device=/dev/video0 ! queue ! video/x-h264,width=1280,height=720,framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink sync=false
Спасибо.

leet27 ()

У тебя левая камера. У оригинальной в выводе так:

ioctl: VIDIOC_ENUM_FMT
	Index       : 0
	Type        : Video Capture
	Pixel Format: 'YUYV'
	Name        : YUYV 4:2:2

	Index       : 1
	Type        : Video Capture
	Pixel Format: 'H264' (compressed)
	Name        : H.264

	Index       : 2
	Type        : Video Capture
	Pixel Format: 'MJPG' (compressed)
	Name        : Motion-JPEG

peregrine ★★★★★ ()
Ответ на: комментарий от rusangl

Прошу прощения за некропост, редко бываю тут, но может кто-то еще будет биться с этой проблемой.

Я для себя решил вопрос кардинально - взял у китайцев ELP-шную камеру, там все нормально. Но после того как с ней повозился, у меня появилось понимание, что я делал не так в случае с логитеком.

user@vaio:~$ v4l2-ctl --list-devices
HD Pro Webcam C920 (usb-0000:00:14.0-3):
        /dev/video0
        /dev/video1

Обратите внимание на /dev/video1 - именно этот девайс, скорее всего, и выдает аппаратно пожатый h264. А я в первом сообщении практически все опыты проводил на /dev/video0, он так же выставлен по умолчанию у v4l2-ctl. Именно так заработало с камерой ELP - она видна в системе как два устройства, одно выдает raw, а другое h264. Логитек давно сдан в магазин, проверить возможности нет. Для проверки достаточно сделать

v4l2-ctl --device=/dev/video1 --list-formats
и убедиться, что в выдаче есть
Pixel Format: 'H264' (compressed)
	Name        : H.264

leet27 ()