使用 Gstreamer 管道读取 v4l2 虚拟相机时出现内部数据流错误

使用 Gstreamer 管道读取 v4l2 虚拟相机时出现内部数据流错误

我使用 v4l2loopback 创建 2 个虚拟摄像机,然后我可以将 mp4 流式传输到这些摄像机中,并使用 gstreamer 管道同时从这些摄像机中读取,就好像 mp4 是这些虚拟摄像机正在录制的视频一样。

我的 gstreamer 管道

videomixer name=mix sink_0::xpos=0 sink_0::ypos=0 ! tee name=t ! videorate ! videoscale ! videoconvert ! video/x-raw,framerate=3/1,format=RGB,height=240,width=320 ! filesink location=/tmp/realtime_ai_video t. ! x264enc name=h264enc tune=zerolatency ! video/x-h264,stream-format=avc,alignment=au ! queue !  appsink name=mp4_appsink enable-last-sample=true emit-signals=true sync=false drop=false v4l2src device=/dev/video0 do-timestamp=true ! image/jpeg,height=240,width=320,framerate=3/1 ! jpegparse ! jpegdec !  video/x-raw,format=I420 ! mix.sink_0

我用来创建虚拟相机的命令

sudo modprobe v4l2loopback devices=2 card_label="Loopback-1,Loopback-2"

我用来将 mp4 流式传输到虚拟摄像机的命令

ffmpeg -re -i r4.mp4 -map 0:v -f v4l2 /dev/video0
ffmpeg -re -i r4.mp4 -map 0:v -f v4l2 /dev/video1

运行管道从虚拟相机读取数据时,我从 gstreamer 收到的错误

#033[33m13772#033[00m 0x560d53aeca40 #033[33;01mWARN   #033[00m #033[00m             basesrc gstbasesrc.c:3127:gst_base_src_loop:<v4l2src0>#033[00m error: Internal data stream error.
#033[33m13772#033[00m 0x560d53aeca40 #033[33;01mWARN   #033[00m #033[00m             basesrc gstbasesrc.c:3127:gst_base_src_loop:<v4l2src0>#033[00m error: streaming stopped, reason not-negotiated (-4)
ERROR:store.cameras.ringbuffer_camera_writer:gst-stream-error-quark: Internal data stream error. (1) | ../libs/gst/base/gstbasesrc.c(3127): gst_base_src_loop (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0
  • v4l2:v0.12.7
  • GStreamer:1.20.3
  • ffmpeg:4.4.2-0ubuntu0.22.04.1
  • 操作系统:Ubuntu 22.04

规定是我不想更改管道命令,除非它是一个小的添加或差异,我想在编辑管道之前用尽任何其他可能性,例如使用 ffmpeg 或 v4l2loopback。

答案1

sudo modprobe v4l2loopback devices=1 exclusive_caps=0 card_label="loopback-1"
v4l2loopback set-fps 3 /dev/video2
ffmpeg -re -i r4.mp4 -s 320x240 -c:v mjpeg -pix_fmt yuvj420p -aspect 1:1 -r 3 -f v4l2 /dev/video2
... and repeat for second camera

我必须匹配 v4l2src 所需的大写字母

相关内容