Hi, I’m trying to save 4 different rtsp stream to one video file. I want to concatenate the 4 stream resolution of 1280x720 to one video of 2560x1440.
I succeed to concatenate the 4 stream to one video file but the video file generated is not compressed. It makes 200Mo for 10secondes. It is too big.
When I checked the codec of the video file created it says ‘Uncompressed packed YUV’
Here is my command :
gst-launch-1.0 -ev \ videomixer name=mix \ sink_1::xpos=0 sink_1::ypos=0 \ sink_2::xpos=1280 sink_2::ypos=0 \ sink_3::xpos=0 sink_3::ypos=720 \ sink_4::xpos=1280 sink_4::ypos=720 \ ! qtmux ! filesink location=mosaic.mp4 \ rtspsrc location='rtsp://192.168.1.19:554/1/h264major' \ ! rtph264depay ! h264parse ! omxh264dec ! nvvidconv \ ! video/x-raw,width=1280,height=720 \ ! mix.sink_1 \ rtspsrc location='rtsp://192.168.1.19:554/1/h264major' \ ! rtph264depay ! h264parse ! omxh264dec ! nvvidconv \ ! video/x-raw,width=1280,height=720 \ ! mix.sink_2 \ rtspsrc location='rtsp://192.168.1.20:554/1/h264major' \ ! rtph264depay ! h264parse ! omxh264dec ! nvvidconv \ ! video/x-raw,width=1280,height=720 \ ! mix.sink_3 \ rtspsrc location='rtsp://192.168.1.20:554/1/h264major' \ ! rtph264depay ! h264parse ! omxh264dec ! nvvidconv \ ! video/x-raw,width=1280,height=720 \ ! mix.sink_4 \
&
PID=$!
sleep 61
kill -INT $PID`
If you have any advice which can help me to reduce the size, to make the file compressed, Thanks!
1 Like
You may try using nvcompositor instead of videomixer.
You may also need to use RTSP2.0 for EOS management.
gst-launch-1.0 -e nvcompositor name=mix background-w=2560 background-h=1440 \
sink_0::xpos=0 sink_0::ypos=0 sink_0::width=1280 sink_0::height=720 \
sink_1::xpos=1280 sink_1::ypos=0 sink_1::width=1280 sink_1::height=720 \
sink_2::xpos=0 sink_2::ypos=720 sink_2::width=1280 sink_2::height=720 \
sink_3::xpos=1280 sink_3::ypos=720 sink_3::width=1280 sink_3::height=720 \
! 'video/x-raw(memory:NVMM),format=RGBA' ! nvvidconv ! 'video/x-raw(memory:NVMM),format=I420' ! nvv4l2h264enc insert-vui=1 ! h264parse ! matroskamux ! filesink location=test.mkv sync=false \
rtspsrc location=rtsp://127.0.0.1:8554/test default-rtsp-version=32 ! application/x-rtp,media=video,encoding-name=H264 ! rtph264depay ! h264parse ! nvv4l2decoder ! 'video/x-raw(memory:NVMM),format=NV12' ! queue ! mix.sink_0 \
rtspsrc location=rtsp://127.0.0.1:8554/test default-rtsp-version=32 ! application/x-rtp,media=video,encoding-name=H264 ! rtph264depay ! h264parse ! nvv4l2decoder ! 'video/x-raw(memory:NVMM),format=NV12' ! queue ! mix.sink_1 \
rtspsrc location=rtsp://127.0.0.1:8554/test default-rtsp-version=32 ! application/x-rtp,media=video,encoding-name=H264 ! rtph264depay ! h264parse ! nvv4l2decoder ! 'video/x-raw(memory:NVMM),format=NV12' ! queue ! mix.sink_2 \
rtspsrc location=rtsp://127.0.0.1:8554/test default-rtsp-version=32 ! application/x-rtp,media=video,encoding-name=H264 ! rtph264depay ! h264parse ! nvv4l2decoder ! 'video/x-raw(memory:NVMM),format=NV12' ! queue ! mix.sink_3
Thanks!
I tried to use your command but it says this :
How can I use rtsp2.0 ?
Maybe the rtsp server in your camera doesn’t support this, but it may not be mandatory.
RTSP1.0 seems working for me for this case:
gst-launch-1.0 -e nvcompositor name=mix background-w=2560 background-h=1440 \
sink_0::xpos=0 sink_0::ypos=0 sink_0::width=1280 sink_0::height=720 \
sink_1::xpos=1280 sink_1::ypos=0 sink_1::width=1280 sink_1::height=720 \
sink_2::xpos=0 sink_2::ypos=720 sink_2::width=1280 sink_2::height=720 \
sink_3::xpos=1280 sink_3::ypos=720 sink_3::width=1280 sink_3::height=720 \
! 'video/x-raw(memory:NVMM),format=RGBA' ! nvvidconv ! 'video/x-raw(memory:NVMM),format=NV12' ! nvv4l2h264enc insert-vui=1 profile=2 ! h264parse ! matroskamux ! filesink location=test.mkv sync=false \
rtspsrc location=rtsp://127.0.0.1:8554/test ! application/x-rtp,media=video,encoding-name=H264 ! rtph264depay ! h264parse ! nvv4l2decoder ! 'video/x-raw(memory:NVMM),format=NV12' ! queue ! mix.sink_0 \
rtspsrc location=rtsp://127.0.0.1:8554/test ! application/x-rtp,media=video,encoding-name=H264 ! rtph264depay ! h264parse ! nvv4l2decoder ! 'video/x-raw(memory:NVMM),format=NV12' ! queue ! mix.sink_1 \
rtspsrc location=rtsp://127.0.0.1:8554/test ! application/x-rtp,media=video,encoding-name=H264 ! rtph264depay ! h264parse ! nvv4l2decoder ! 'video/x-raw(memory:NVMM),format=NV12' ! queue ! mix.sink_2 \
rtspsrc location=rtsp://127.0.0.1:8554/test ! application/x-rtp,media=video,encoding-name=H264 ! rtph264depay ! h264parse ! nvv4l2decoder ! 'video/x-raw(memory:NVMM),format=NV12' ! queue ! mix.sink_3
Thanks a lot !! It works as I wish
Hi, the code you give me works but does not work every time. It gives me this error.
ERROR: from element /GstPipeline:pipeline0/GstMatroskaMux:matroskamux0: Could not multiplex stream.
Additional debug info:
matroska-mux.c(986): gst_matroska_mux_video_pad_setcaps (): /GstPipeline:pipeline0/GstMatroskaMux:matroskamux0:
Caps changes are not supported by Matroska
EOS on shutdown enabled – waiting for EOS after Error
Waiting for EOS…
ERROR: from element /GstPipeline:pipeline0/GstMatroskaMux:matroskamux0: Could not multiplex stream.
Additional debug info:
matroska-mux.c(986): gst_matroska_mux_video_pad_setcaps (): /GstPipeline:pipeline0/GstMatroskaMux:matroskamux0:
Caps changes are not supported by Matroska
Do you have an idea why sometimes it crashes ?
Thanks!
The error message says that caps changed and matroskamux doesn’t support this.
You may try to scale each decoded source to 720p, set fixed caps and add -v flag, so that you’ll get some details about what caps changed before the error:
gst-launch-1.0 -ev nvcompositor name=mix \
sink_0::xpos=0 sink_0::ypos=0 sink_0::width=1280 sink_0::height=720 \
sink_1::xpos=1280 sink_1::ypos=0 sink_1::width=1280 sink_1::height=720 \
sink_2::xpos=0 sink_2::ypos=720 sink_2::width=1280 sink_2::height=720 \
sink_3::xpos=1280 sink_3::ypos=720 sink_3::width=1280 sink_3::height=720 \
! 'video/x-raw(memory:NVMM),format=RGBA,width=2560,height=1440,framerate=30/1' ! nvvidconv ! 'video/x-raw(memory:NVMM),format=NV12' ! nvv4l2h264enc insert-vui=1 profile=2 \
! h264parse ! video/x-h264,width=2560,height=1440,framerate=30/1 ! matroskamux ! filesink location=test.mkv sync=false \
rtspsrc location=rtsp://127.0.0.1:8554/test ! application/x-rtp,media=video,encoding-name=H264 ! rtph264depay ! h264parse ! nvv4l2decoder ! nvvidconv ! 'video/x-raw(memory:NVMM),format=NV12,width=1280,height=720,pixel-aspect-ratio=1/1' ! queue ! mix.sink_0 \
rtspsrc location=rtsp://127.0.0.1:8554/test ! application/x-rtp,media=video,encoding-name=H264 ! rtph264depay ! h264parse ! nvv4l2decoder ! nvvidconv ! 'video/x-raw(memory:NVMM),format=NV12,width=1280,height=720,pixel-aspect-ratio=1/1' ! queue ! mix.sink_1 \
rtspsrc location=rtsp://127.0.0.1:8554/test ! application/x-rtp,media=video,encoding-name=H264 ! rtph264depay ! h264parse ! nvv4l2decoder ! nvvidconv ! 'video/x-raw(memory:NVMM),format=NV12,width=1280,height=720,pixel-aspect-ratio=1/1' ! queue ! mix.sink_2 \
rtspsrc location=rtsp://127.0.0.1:8554/test ! application/x-rtp,media=video,encoding-name=H264 ! rtph264depay ! h264parse ! nvv4l2decoder ! nvvidconv ! 'video/x-raw(memory:NVMM),format=NV12,width=1280,height=720,pixel-aspect-ratio=1/1' ! queue ! mix.sink_3
Thanks !
It sends no error, but when I want to stop the programm with Ctrl+C it sends this error :
ERROR: from element /GstPipeline:pipeline0/GstQueue:queue1: Internal data stream error.
Additional debug info:
gstqueue.c(988): gst_queue_handle_sink_event (): /GstPipeline:pipeline0/GstQueue:queue1:
streaming stopped, reason not-negotiated (-4)
An error happened while waiting for EOS
Execution ended after 0:00:21.379088927
Setting pipeline to PAUSED …
Setting pipeline to READY …
Setting pipeline to NULL …
Freeing pipeline …
Is there a way to stop properly exit a gstreamer pipeline ?
I’m using this :
nvvidconv ! ‘video/x-raw(memory:NVMM),format=NV12,width=1280,height=720,pixel-aspect-ratio=1/1’ ! queue ! mix.sink_3
&
PID=$!
sleep 21
kill -INT $PID
You may try removing -e
or sending signal twice.
Thanks it working !
Now when I play the video file created it doesn’t show the total duration like this :
The information of the file is that :
Do you have an idea why my video file is “corrupted” ?
By using the command in your post of the april 29 :
Maybe the rtsp server in your camera doesn’t support this, but it may not be mandatory.
RTSP1.0 seems working for me for this case:
The file has a duration set.
Do you have any idea why one is working and the other one no?
Thanks in advance