GStreamer + V4L2loopback как веб-камера, совместимая с Chrome

Я пытаюсь создать виртуальную камеру в Chrome с помощью v4l2loopback, где входящее видео-H264 через RTP.

у меня есть некоторый успех в получении тестового видео GStreamer, распознанного в Chrome с MediaStreamTrack.getSources:

$ sudo modprobe v4l2loopback
$ gst-launch-1.0 videotestsrc ! v4l2sink device=/dev/video0

это работает хорошо, Chrome отобразит Источник видео теста.

однако, когда я использую входящий источник h264/RTP, устройство не отображается в MediaStreamTrack.getSources. Например:

gst-launch-1.0 -v tcpclientsrc host=<IPADDRESS> port=5000  ! gdpdepay !  rtph264depay ! avdec_h264 ! videoconvert ! v4l2sink device=/dev/video0

в чем причина этого? Каким будет решение?

Я думал, возможно, это связано с видеоформатами и, возможно, правильными шапками, которые необходимо установить через v4l2loopback.

1 ответов


это похоже на ошибку в gstreamer или v4l2loopback. Это как-то связано с тем, как обрабатывается переменная частота кадров.

мне удалось воспроизвести его таким образом:

запустить конвейер передачи видео из сети в /dev/video0

$ gst-launch-1.0 -v tcpserversrc port=5000 \
    ! gdpdepay ! rtph264depay \
    ! decodebin \
    ! v4l2sink device=/dev/video0

запустите конвейер, передающий видео на порт 5000

$ gst-launch-1.0 -v videotestsrc \
    ! x264enc ! rtph264pay ! gdppay \
    ! tcpserversink port=5000

попробуйте получить видео от /dev/video0

$ gst-launch v4l2src device=/dev/video0 ! autovideosink
...
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Device '/dev/video1' is not a capture device.
обратите внимание на шапки для v4l2sink в журнале отладки первого трубопровод.
/GstPipeline:pipeline0/GstV4l2Sink:v4l2sink0.GstPad:sink: caps = video/x-raw, format=(string)I420, width=(int)320, height=(int)240, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, colorimetry=(string)bt601, framerate=(fraction)0/1

в нем говорится, что framerate=(fraction)0/1. В терминах gstreamer это означает, что частота кадров является переменной. Согласно v4l2sinkисходный код кажется, что он подает эту же частоту кадров в v4l2loopback модуль ядра, но v4l2loopback не понимает нулевую частоту кадров.
(Это только гипотеза, все еще нужно проверить, действительно ли это происходит.)

чтобы обойти эту ошибку, вы можете исправить частоту кадров. Просто добавьте videorate элемент к первому трубопровод:

$ gst-launch-1.0 -v tcpserversrc port=5000 \
    ! gdpdepay ! rtph264depay \
    ! decodebin \
    ! videorate ! video/x-raw, framerate=25/1 \
    ! v4l2sink device=/dev/video0