GStreamer + V4L2loopback兼容Chrome兼容网络摄像头

Ros*_*oss 9 google-chrome gstreamer v4l2loopback

我正在尝试使用v4l2loopback在Chrome中创建虚拟相机,其中传入的视频是通过RTP输入的H264.

我在Chrome中识别GStreamer测试视频方面取得了一些成功MediaStreamTrack.getSources:

$ sudo modprobe v4l2loopback
$ gst-launch-1.0 videotestsrc ! v4l2sink device=/dev/video0
Run Code Online (Sandbox Code Playgroud)

这很有效,Chrome会显示视频测试源.

但是,当我使用传入的h264/RTP源时,设备不会显示MediaStreamTrack.getSources.例如:

gst-launch-1.0 -v tcpclientsrc host=<IPADDRESS> port=5000  ! gdpdepay !  rtph264depay ! avdec_h264 ! videoconvert ! v4l2sink device=/dev/video0
Run Code Online (Sandbox Code Playgroud)

这是什么原因?解决方案是什么?

我原本以为这可能与视频格式有关,也许需要通过v4l2loopback设置正确的上限.

max*_*kin 5

这看起来像是 gstreamer 或 v4l2loopback 中的错误。它与如何处理可变帧速率有关。

我设法以这种方式重现它:

开始管道将视频从网络传输到 /dev/video0

$ gst-launch-1.0 -v tcpserversrc port=5000 \
    ! gdpdepay ! rtph264depay \
    ! decodebin \
    ! v4l2sink device=/dev/video0
Run Code Online (Sandbox Code Playgroud)

开始管道传输一些视频到端口 5000

$ gst-launch-1.0 -v videotestsrc \
    ! x264enc ! rtph264pay ! gdppay \
    ! tcpserversink port=5000
Run Code Online (Sandbox Code Playgroud)

尝试从 /dev/video0

$ gst-launch v4l2src device=/dev/video0 ! autovideosink
...
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Device '/dev/video1' is not a capture device.
Run Code Online (Sandbox Code Playgroud)

现在,请注意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
Run Code Online (Sandbox Code Playgroud)

它提到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
Run Code Online (Sandbox Code Playgroud)