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
- G스트리머: 1.20.3
- ffmpeg:4.4.2-0ubuntu0.22.04.1
- 운영 체제: 우분투 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에서 요구하는 대문자와 일치해야 합니다.