Re-stream Motion JPEG network connected webcam via GStreamer-RTSP (RFC2435) - pipeline help

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Re-stream Motion JPEG network connected webcam via GStreamer-RTSP (RFC2435) - pipeline help

Matt Thyer
Dear GStreamer developers,

I'm trying to re-stream a Motion-JPEG stream via the GStreamer RTSP server (i.e. RFC2435 extension to RTSP) but am having trouble with my pipeline.
The video source is an "i-Spy Tank" by HappyCow. See: https://www.youtube.com/watch?v=p-_fnMRzcKE
There's a blog on accessing this tank's video, turret and track controls here: https://devblog.kogan.com/blog/hacking-the-wifi-spy-tank
Think of it as a simple WiFi connected web camera where the device presents as an open wireless access point.
The Motion JPEG video stream is at: http://10.10.1.1:8196/ (not port 9876 as the devblog confusingly says!).

VLC tells me that the stream is:
   Codec: Motion JPEG (MJPG)
   Resolution: 640x480
   Display resolution: 640x480
   Decoded format: Planar 4:2:2 YUV full scale

What's working:
I've successfully saved the individual JPEG frames with the following pipeline:
gst-launch-1.0 -e souphttpsrc location=http://10.10.1.1:8196/ ! multipartdemux ! image/jpeg,width=640,height=480 ! multifilesink location=frame%05d.jpeg

What's not working:
I'm unable to re-stream using GStreamer RTSP so far...
I've tried pipelines: "souphttpsrc location=http://10.10.1.1:8196/ ! multipartdemux ! rtpjpegpay"
and: "souphttpsrc location=http://10.10.1.1:8196/ do-timestamp=true ! multipartdemux ! image/jpeg,width=640,height=480 ! rtpjpegpay"
But both of these pipelines fail with error:
"FIXME              rtspmedia rtsp-media.c:3835:gst_rtsp_media_suspend: suspend for dynamic pipelines needs fixing"
(When run with GST_DEBUG="*:3").
My understanding of this error is that it's due to a capabilities mismatch between elements.
Is this the case?

I've seen some people use "avdec_mjpeg" and then re-encode but I'd rather not go to that extreme... If it's incompatible or missing capabilities, how can I artificially provide these caps without transcoding?

Matt Thyer

_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: Re-stream Motion JPEG network connected webcam via GStreamer-RTSP (RFC2435) - pipeline help

Matt Thyer
I've made some good progress.

Apparently GStreamer RTSP server needed the RTP payload to be named "pay0".
The "rtpjpegpay" element defaulted to a name of "rtpjpegpay0".
I've also set the payload type to 26 ("pt=26") as I think it should be.

I then needed to insert a capsfilter of "image/jpeg,width=640,height=480" after the "multipartdemux" element.
This got me an initial image and an endless stream of "FIXME" messages (at GST_DEBUG="*:3") but video wasn't animated....

The final fix was to use the "do-timestamp=true" and "is_live=true" parameters with the "souphttpsrc" element.
I now have a nicely restreamed feed but I still get an endless stream of FIXME and some WARNs (at GST_DEBUG="*:3").
I guess the answer to that is not to look at the debug messages!

My final pipeline is:
"souphttpsrc location=http://10.10.1.1:8196/ do-timestamp=true is_live=true ! multipartdemux ! image/jpeg,width=640,height=480 ! rtpjpegpay name=pay0 pt=26"

Does anyone know if I can improve on this?

The FIXME and WARNs are:

1 of:
FIXME             rtpjpegpay gstrtpjpegpay.c:751:gst_rtp_jpeg_pay_handle_buffer:<pay0> unhandled marker 0xff
Many of:
FIXME             rtpjpegpay gstrtpjpegpay.c:751:gst_rtp_jpeg_pay_handle_buffer:<pay0> unhandled marker 0x00
2 of:
FIXME             rtpjpegpay gstrtpjpegpay.c:751:gst_rtp_jpeg_pay_handle_buffer:<pay0> unhandled marker 0xff
1 of:
WARN              rtpjpegpay gstrtpjpegpay.c:733:gst_rtp_jpeg_pay_handle_buffer:<pay0> EOI reached before SOS!
2 of:
WARN              rtspstream rtsp-stream.c:4504:gst_rtsp_stream_seekable:<GstRTSPStream@0x7f9198048330> seeking query failed
2 of:
FIXME              rtspmedia rtsp-media.c:3833:gst_rtsp_media_suspend: suspend for dynamic pipelines needs fixing
1 of:
FIXME             rtspclient rtsp-client.c:1646:handle_play_request:<GstRTSPClient@0x1417120> Add support for seek style (null)
3 of:
WARN              rtspstream rtsp-stream.c:4504:gst_rtsp_stream_seekable:<GstRTSPStream@0x7f9198048330> seeking query failed
1 of:
FIXME             rtpjpegpay gstrtpjpegpay.c:751:gst_rtp_jpeg_pay_handle_buffer:<pay0> unhandled marker 0xff
Many of:
FIXME             rtpjpegpay gstrtpjpegpay.c:751:gst_rtp_jpeg_pay_handle_buffer:<pay0> unhandled marker 0x00
1 of:
FIXME             rtpjpegpay gstrtpjpegpay.c:751:gst_rtp_jpeg_pay_handle_buffer:<pay0> unhandled marker 0xff
1 of:
WARN              rtpjpegpay gstrtpjpegpay.c:733:gst_rtp_jpeg_pay_handle_buffer:<pay0> EOI reached before SOS!
1 of:
FIXME             rtpjpegpay gstrtpjpegpay.c:751:gst_rtp_jpeg_pay_handle_buffer:<pay0> unhandled marker 0xff
Many of:
FIXME             rtpjpegpay gstrtpjpegpay.c:751:gst_rtp_jpeg_pay_handle_buffer:<pay0> unhandled marker 0x00
etc...

Thanks in advance

On Wed, 6 Mar 2019 at 12:11, Matt Thyer <[hidden email]> wrote:
Dear GStreamer developers,

I'm trying to re-stream a Motion-JPEG stream via the GStreamer RTSP server (i.e. RFC2435 extension to RTSP) but am having trouble with my pipeline.
The video source is an "i-Spy Tank" by HappyCow. See: https://www.youtube.com/watch?v=p-_fnMRzcKE
There's a blog on accessing this tank's video, turret and track controls here: https://devblog.kogan.com/blog/hacking-the-wifi-spy-tank
Think of it as a simple WiFi connected web camera where the device presents as an open wireless access point.
The Motion JPEG video stream is at: http://10.10.1.1:8196/ (not port 9876 as the devblog confusingly says!).

VLC tells me that the stream is:
   Codec: Motion JPEG (MJPG)
   Resolution: 640x480
   Display resolution: 640x480
   Decoded format: Planar 4:2:2 YUV full scale

What's working:
I've successfully saved the individual JPEG frames with the following pipeline:
gst-launch-1.0 -e souphttpsrc location=http://10.10.1.1:8196/ ! multipartdemux ! image/jpeg,width=640,height=480 ! multifilesink location=frame%05d.jpeg

What's not working:
I'm unable to re-stream using GStreamer RTSP so far...
I've tried pipelines: "souphttpsrc location=http://10.10.1.1:8196/ ! multipartdemux ! rtpjpegpay"
and: "souphttpsrc location=http://10.10.1.1:8196/ do-timestamp=true ! multipartdemux ! image/jpeg,width=640,height=480 ! rtpjpegpay"
But both of these pipelines fail with error:
"FIXME              rtspmedia rtsp-media.c:3835:gst_rtsp_media_suspend: suspend for dynamic pipelines needs fixing"
(When run with GST_DEBUG="*:3").
My understanding of this error is that it's due to a capabilities mismatch between elements.
Is this the case?

I've seen some people use "avdec_mjpeg" and then re-encode but I'd rather not go to that extreme... If it's incompatible or missing capabilities, how can I artificially provide these caps without transcoding?

Matt Thyer

_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel