1

I have a python script that receives jpeg encoded data using following pipeline and sends the jpeg data on a port.

rtspsrc location=rtsp://192.168.100.40:8554/ latency=0 retry=50 ! rtph265depay ! h265parse ! avdec_h265 ! videoscale ! videorate ! video/x-raw, framerate=10/1, width=1920, height=1080 ! jpegenc quality=85 ! image/jpeg ! appsink

At the receiver end I want to save the incoming data as a video, as described in this link https://gstreamer.freedesktop.org/documentation/jpeg/jpegenc.html

gst-launch-1.0 videotestsrc num-buffers=50 ! video/x-raw, framerate='(fraction)'5/1 ! jpegenc ! avimux ! filesink location=mjpeg.avi

I have tried using opencv's VideoWriter with CAP_GSTREAMER

pipeline = f'appsrc ! avimux ! filesink location=recording.avi'
cap_write = cv2.VideoWriter(pipeline,cv2.CAP_GSTREAMER,0, 1, (1920,1080), False)
...
cap_write.write(jpgdata)

but it gives a runtime warning

[ WARN:0] global ../opencv/modules/videoio/src/cap_gstreamer.cpp (1948) writeFrame OpenCV | GStreamer warning: Error pushing buffer to GStreamer pipeline

If I modify the pipeline and use

    pipeline = f'appsrc ! videoconvert ! videorate ! video/x-raw, framerate=1/1 ! filesink location=recording.avi'

The code does save the incoming frames as video but the saved video is too big with no bitrate and duration information in it.

ffmpeg -i recording.avi 
...
[mjpeg @ 0x560f4a408600] Format mjpeg detected only with low score of 25, misdetection possible!
Input #0, mjpeg, from 'recording.avi':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 1920x1080 [SAR 1:1 DAR 16:9], 25 tbr, 1200k tbn, 25 tbc
At least one output file must be specified

Need help!

  • You may better explain your use case. Do you need to process H264 frames or just want to transcode ? Transcoding and re-streaming with gstreamer would be simple. However, not sure that OpenCv writer with gstreamer backend is able to receive jpeg frames. – SeB Feb 26 '22 at 20:29
  • @SeB My use case is simply to save the incoming jpeg encoded frames as a video. Video can be avi or mp4. But I'd prefer to reduce the processing cost. – Omair Hassaan Feb 28 '22 at 12:34

0 Answers0