我正在尝试使用v4l2loopback在Chrome中创建虚拟相机,其中传入的视频是通过RTP输入H264。
我在使用MediaStreamTrack.getSources
在Chrome中识别GStreamer测试视频方面取得了一些成功:
$ 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设置正确的上限。
答案 0 :(得分:3)
这看起来像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的术语中,这意味着帧速率是可变的。根据{{1}}的源代码,似乎它将相同的帧速率提供给v4l2sink
内核模块,但v4l2loopback
不了解零帧速率。
(这只是假设,仍然需要检查这是否真的发生了。)
要解决此错误,您可以修复帧速率。只需将v4l2loopback
元素添加到第一个管道:
videorate