简体   繁体   中英

Sink to the virtual v4l2 device

I have tried an example on Ubuntu 19.04

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

But gstreamer fails

Setting pipeline to PAUSED ...
ERROR: Pipeline doesn't want to pause.
ERROR: from element /GstPipeline:pipeline0/GstV4l2Sink:v4l2sink0: Cannot identify device '/dev/video10'.
Additional debug info:
v4l2_calls.c(609): gst_v4l2_open (): /GstPipeline:pipeline0/GstV4l2Sink:v4l2sink0:
system error: No such file or directory
Setting pipeline to NULL ...
Freeing pipeline ...

Why it doesn't work? I haven't found this in the documentation, do I need to create /dev/video10 somehow?

I did the same for the default device /dev/video1, but it is an input camera device on my laptop:

sudo gst-launch-1.0 videotestsrc ! v4l2sink 
Setting pipeline to PAUSED ...
ERROR: Pipeline doesn't want to pause.
ERROR: from element /GstPipeline:pipeline0/GstV4l2Sink:v4l2sink0: Device '/dev/video1' is not a output device.
Additional debug info:
v4l2_calls.c(639): gst_v4l2_open (): /GstPipeline:pipeline0/GstV4l2Sink:v4l2sink0:
Capabilities: 0x4a00000
Setting pipeline to NULL ...
Freeing pipeline ...

Thank in advance.

The title of your questions suggests you would like to write to a virtual video device. v4l2 devices can be both input and output video devices. Your camera is a video input (capture) device. Directing a v4l2sink (so an endpoint of the pipeline) in gstreamer will likely fail.

You can however generate a virtual output device. What you are looking for is something like the v4l2-loopback device. It allows you to generate a virtual /dev/video10 device like this:

modprobe v4l2loopback video_nr=10

Another possible solution for the same error message: recreate the v4l2loopback interface:

sudo rmmod -f v4l2loopback
sudo modprobe v4l2loopback

This might apply to others experiencing the error message from the original question, but who are already aware they need a v4l2loopback device as gstreamer sink.

When trying to stream a video to the existing v4l2loopback device I streamed to using ffmpeg before, I got the same error message

Device '/dev/video0' is not a output device.

Investigation

When comparing the state of a working loopback video device and a non-working one (ie after writing to it with ffmpeg) with v4l2-ctl --all -d 0 using diff , I found the following difference :

--- working     2020-11-19 18:03:52.499440518 +0100
+++ non-working 2020-11-19 18:03:57.472802868 +0100
@@ -3,21 +3,18 @@
         Card type        : GPhoto2 Webcam
         Bus info         : platform:v4l2loopback-000
         Driver version   : 5.9.8
-        Capabilities     : 0x85208002
-                Video Output
+        Capabilities     : 0x85208000
                 Video Memory-to-Memory
                 Read/Write
                 Streaming
                 Extended Pix Format
                 Device Capabilities
-        Device Caps      : 0x05208002
-                Video Output
+        Device Caps      : 0x05208000
                 Video Memory-to-Memory
                 Read/Write
                 Streaming
                 Extended Pix Format
 Priority: 0
-Video output: 0 (loopback in)
 Format Video Output:
         Width/Height      : 960/640
         Pixel Format      : 'YU12' (Planar YUV 4:2:0)

Somehow that "Video Output" capability is required for gstreamer to work successfully and taken away by my previous ffmpeg call. The behaviour only occured when I loaded the v4l2loopback module with the exclusive_caps=1 option, see 1 .

The solution was to unload / load the v4l2loopback kernel commands, forcefully removing the v4l2loopback kernel module and adding it again using rmmod / modprobe (see above).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM