我正试图用v4l2loopback在Chrome中创建一个虚拟摄像头,其中的视频是通过RTP输入的H264。
我已经取得了一些成功的GStreamer测试视频识别在Chrome与MediaStreamTrack.getSources
$ sudo modprobe v4l2loopback
$ gst-launch-1.0 videotestsrc ! v4l2sink device=/dev/video0这很好,Chrome将显示视频测试源。
但是,当我使用传入的H 264/RTP源时,设备不会出现在MediaStreamTrack.getSources中。例如:
gst-launch-1.0 -v tcpclientsrc host=<IPADDRESS> port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! videoconvert ! v4l2sink device=/dev/video0原因是什么?解决办法是什么?
我曾想过,这可能与视频格式有关,也许需要通过v4l2loopback设置正确的上限。
发布于 2014-03-26 10:55:35
这看起来像是gstreamer或v4l2loopback中的一个bug。它与可变帧速率的处理方式有某种关系。
我用这种方式复制了它:
启动从网络传输视频到/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/video0https://stackoverflow.com/questions/22439221
复制相似问题