在使用v4l2loopback创建的虚拟设备中复制网络摄像头流 [英] duplicate webcam stream in a virtual device created with v4l2loopback

查看:14
本文介绍了在使用v4l2loopback创建的虚拟设备中复制网络摄像头流的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

视频流之神您好 例如,我正在尝试复制网络摄像头流,以便在发送它的同时仍能在Web浏览器中使用它 目标是使用v4l2Loopback创建一个虚拟视频设备使用GStreamer从真实的网络摄像头获取信号源,在我需要的地方创建一个TEE流(RTPS服务器),并在另一个TEE分支上使用v4l2接收器转发到使用v4l2Loopback创建的虚拟设备

我在ubuntu 20.04下测试,但计划最后在Raspian Buster上使用它 我已经

sudo apt install v4l2loopback-dkms v4l2loopback-utils

sudo modprobe v4l2loopback video_nr=100

看起来没问题

$ v4l2-ctl --all -d /dev/video100 
Driver Info:
    Driver name      : v4l2 loopback
    Card type        : Dummy video device (0x0000)
    Bus info         : platform:v4l2loopback-000
    Driver version   : 5.4.65
    Capabilities     : 0x85208003
        Video Capture
        Video Output
        Video Memory-to-Memory
        Read/Write
        Streaming
        Extended Pix Format
        Device Capabilities
    Device Caps      : 0x85208000
        Video Memory-to-Memory
        Read/Write
        Streaming
        Extended Pix Format
        Device Capabilities
Priority: 0
Video input : 0 (loopback: ok)
Video output: 0 (loopback in)
Format Video Output:
    Width/Height      : 1920/1080
    Pixel Format      : 'YU12' (Planar YUV 4:2:0)
    Field             : None
    Bytes per Line    : 1920
    Size Image        : 3110400
    Colorspace        : sRGB
    Transfer Function : Default (maps to sRGB)
    YCbCr/HSV Encoding: Default (maps to ITU-R 601)
    Quantization      : Default (maps to Limited Range)
    Flags             : 
Streaming Parameters Video Capture:
    Frames per second: 30.000 (30/1)
    Read buffers     : 8
Streaming Parameters Video Output:
    Frames per second: 30.000 (30/1)
    Write buffers    : 8

User Controls

                    keep_format 0x0098f900 (bool)   : default=0 value=0
              sustain_framerate 0x0098f901 (bool)   : default=0 value=0
                        timeout 0x0098f902 (int)    : min=0 max=100000 step=1 default=0 value=0
               timeout_image_io 0x0098f903 (bool)   : default=0 value=0
 here

在传输我的真正的网络摄像头之前,我只是尝试像GStreamer v412接收器文档中解释的那样传输视频测试src

 gst-launch-1.0 videotestsrc ! v4l2sink device=/dev/video100

奇怪的是,它说它不是输出设备(GST-DEBUG=3)

    $  gst-launch-1.0 videotestsrc ! v4l2sink device=/dev/video100
    Setting pipeline to PAUSED ...
    0:00:00.137162087 12355 0x5601d5516010 WARN                    v4l2 v4l2_calls.c:636:gst_v4l2_open:<v4l2sink0> error: Device '/dev/video100' is not a output device.
    0:00:00.137209656 12355 0x5601d5516010 WARN                    v4l2 v4l2_calls.c:636:gst_v4l2_open:<v4l2sink0> error: Capabilities: 0x85208000
    ERROR: Pipeline doesn't want to pause.
    ERROR: from element /GstPipeline:pipeline0/GstV4l2Sink:v4l2sink0: Device '/dev/video100' is not a output device.
    Additional debug info:
    v4l2_calls.c(636): gst_v4l2_open (): /GstPipeline:pipeline0/GstV4l2Sink:v4l2sink0:
    Capabilities: 0x85208000
    Setting pipeline to NULL ...
    Freeing pipeline ...
我一直在寻找其他和我一样的问题,但可能我没有很好地搜索,没有找到任何相关的信息 如果有人能帮上忙,我会很乐意的

感谢So Mutch在这里阅读,并感谢So Mutch More提供任何帮助信息和想法等

编辑: 我还试了一下Raspian Buster覆盆子pi 4 我在安装时遇到了一些v4l2loopback问题,但我遵循了主题,并能够安装它 我执行了相同的操作(modProbe,然后是gstream),GStreamer v4l2Sink在使用变通办法以避免未协商的错误时看起来是有效的

gst-launch-1.0 videotestsrc ! identity drop-allocation=1 ! v4l2sink device=/dev/video100

它看起来起作用了,但我收到了很多警告:

$ gst-launch-1.0 -v videotestsrc ! identity drop-allocation=1 ! v4l2sink device=/dev/video100
Définition du pipeline à PAUSED...
Le pipeline est en phase de PREROLL…
0:00:00.128889803 11076   0xe230f0 FIXME                default gstutils.c:3981:gst_pad_create_stream_id_internal:<videotestsrc0:src> Creating random stream-id, consider implementing a deterministic way of creating a stream-id
0:00:00.129497619 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at YUYV@48x32: 0
0:00:00.129647893 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at UYVY@48x32: 0
0:00:00.129766111 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at 422P@48x32: 0
0:00:00.129872201 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at YU12@48x32: 0
0:00:00.129975513 11076   0xe230f0 WARN                    v4l2 gstv4l2o$ gst-launch-1.0 -v videotestsrc ! identity drop-allocation=1 ! v4l2sink device=/dev/video100
Définition du pipeline à PAUSED...
Le pipeline est en phase de PREROLL…
0:00:00.128889803 11076   0xe230f0 FIXME                default gstutils.c:3981:gst_pad_create_stream_id_internal:<videotestsrc0:src> Creating random stream-id, consider implementing a deterministic way of creating a stream-id
0:00:00.129497619 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at YUYV@48x32: 0
0:00:00.129647893 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at UYVY@48x32: 0
0:00:00.129766111 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at 422P@48x32: 0
0:00:00.129872201 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at YU12@48x32: 0
0:00:00.129975513 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at YV12@48x32: 0
0:00:00.130079232 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at 411P@48x32: 0
0:00:00.130190210 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at YVU9@48x32: 0
0:00:00.130291689 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at YUV9@48x32: 0
0:00:00.130395612 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at JPEG@48x32: 0
0:00:00.130483220 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at MJPG@48x32: 0
0:00:00.130570810 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at dvsd@48x32: 0
0:00:00.130658326 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at RGB4@48x32: 0
0:00:00.130753046 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at BGR4@48x32: 0
0:00:00.130847173 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at RGB3@48x32: 0
0:00:00.130959966 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at BGR3@48x32: 0
0:00:00.131055000 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at NV12@48x32: 0
0:00:00.131170441 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at RGBQ@48x32: 0
0:00:00.131266012 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at RGBP@48x32: 0
0:00:00.131359676 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at RGBO@48x32: 0
0:00:00.131454285 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at BA81@48x32: 0
0:00:00.131539338 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at GBRG@48x32: 0
0:00:00.131623317 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at GRBG@48x32: 0
0:00:00.131707907 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at RGGB@48x32: 0
0:00:00.131792701 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at GREY@48x32: 0
0:00:00.131889365 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at VP90@48x32: 0
0:00:00.131974881 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at VP80@48x32: 0
0:00:00.132062378 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at VC1L@48x32: 0
0:00:00.132151839 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at VC1G@48x32: 0
0:00:00.132250595 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at XVID@48x32: 0
0:00:00.132340129 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at MPG4@48x32: 0
0:00:00.132427053 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at MPG2@48x32: 0
0:00:00.132513495 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at MPG1@48x32: 0
0:00:00.132601677 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at H263@48x32: 0
0:00:00.132691304 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at AVC1@48x32: 0
0:00:00.132781080 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at H264@48x32: 0
0:00:00.132869910 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at Y16 @48x32: 0
0:00:00.132966408 11076   0xe230f0 WARN                    v4l2 gstv4l2object.c:2514:gst_v4l2_object_probe_caps_for_format_and_size:<v4l2sink0:sink> Unknown frame interval type at YVYU@48x32: 0
/GstPipeline:pipeline0/GstVideoTestSrc:videotestsrc0.GstPad:src: caps = video/x-raw, format=(string)YUY2, width=(int)320, height=(int)240, framerate=(fraction)30/1, multiview-mode=(string)mono, interlace-mode=(string)progressive, colorimetry=(string)2:4:7:1, pixel-aspect-ratio=(fraction)1/1
/GstPipeline:pipeline0/GstIdentity:identity0.GstPad:src: caps = video/x-raw, format=(string)YUY2, width=(int)320, height=(int)240, framerate=(fraction)30/1, multiview-mode=(string)mono, interlace-mode=(string)progressive, colorimetry=(string)2:4:7:1, pixel-aspect-ratio=(fraction)1/1
/GstPipeline:pipeline0/GstV4l2Sink:v4l2sink0.GstPad:sink: caps = video/x-raw, format=(string)YUY2, width=(int)320, height=(int)240, framerate=(fraction)30/1, multiview-mode=(string)mono, interlace-mode=(string)progressive, colorimetry=(string)2:4:7:1, pixel-aspect-ratio=(fraction)1/1
/GstPipeline:pipeline0/GstIdentity:identity0.GstPad:sink: caps = video/x-raw, format=(string)YUY2, width=(int)320, height=(int)240, framerate=(fraction)30/1, multiview-mode=(string)mono, interlace-mode=(string)progressive, colorimetry=(string)2:4:7:1, pixel-aspect-ratio=(fraction)1/1
Le pipeline a terminé la phase PREROLL…
Passage du pipeline à la phase PLAYING…
New clock: GstSystemClock

和最终尝试从此视频设备获取和图像时

     $ ffmpeg -f video4linux2 -s 640x480 -i /dev/video100 -ss 0:0:2 -frames 1 /tmp/out2.jpg
    ffmpeg version 4.1.6-1~deb10u1+rpt1 Copyright (c) 2000-2020 the FFmpeg developers
      built with gcc 8 (Raspbian 8.3.0-6+rpi1)
...[truncated because of stack overflow body size limit]...
    Stream mapping:
      Stream #0:0 -> #0:0 (rawvideo (native) -> mjpeg (native))
    Press [q] to stop, [?] for help
    [swscaler @ 0x136f230] deprecated pixel format used, make sure you did set range correctly
    Output #0, image2, to '/tmp/out2.jpg':
      Metadata:
        encoder         : Lavf58.20.100
        Stream #0:0: Video: mjpeg, yuvj422p(pc), 320x240, q=2-31, 200 kb/s, 30 fps, 30 tbn, 30 tbc
        Metadata:
          encoder         : Lavc58.35.100 mjpeg
        Side data:
          cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
    [video4linux2,v4l2 @ 0x1363200] Dequeued v4l2 buffer contains 155648 bytes, but 153600 were expected. Flags: 0x00000001.
    /dev/video100: Invalid data found when processing input
    frame=    0 fps=0.0 q=0.0 Lsize=N/A time=00:00:00.00 bitrate=N/A speed=   0x    
    video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
    Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)

推荐答案

我刚刚讲过这一点,并将解释V4L2视频设备的大绊脚石。基本问题是真实设备只能访问一次,而环回设备不受限制。 首先启动您的USB网络摄像头。您现在应该有/dev/Video0和/dev/avio1。我不知道为什么要创建视频1,但请忽略它。 接下来,使用&modprobe v4l2loopback Devices=4";启动v4l2loopback,现在您应该有了视频0到视频6。 现在到了棘手的部分,如果您尝试将/dev/Video0复制到/dev/avio3中,Video3将起作用,但Video0现在将报告设备或资源忙,因此您仍然只能使用1个视频输出。这是因为实际设备一次只能由一个程序访问,因为它们具有实际的V4L2控件。不能让两个程序访问相同的控件。

解决方案是复制/dev/Video0两次,如下所示: Ffmpeg-f avio4linux2-i/dev/Video0-编解码器副本-f V4L2/dev/avio3-编解码器副本-f V4L2/dev/avio4

现在,您可以使用";ffplay-i/dev/avio3";观看正常的视频0 此外,您还可以使用/dev/avio4执行其他操作,如下所示

GST-Launch-1.0-v v4l2src设备=/dev/avio4!自动视频转换!视频转换!视频/x-RAW,宽度=640,高度=480,帧速率=30/1!韦尔蒂戈夫!V412接收器设备=/dev/avio5

现在,您可以使用";ffplay-i/dev/avio3";查看原始视频,并使用";ffplay-i/dev/avio5";查看经过处理的视频

我希望这会有帮助,我用谷歌搜索了几个小时才弄明白这一点。:-)

这篇关于在使用v4l2loopback创建的虚拟设备中复制网络摄像头流的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆