4

I have two video streaming units capable of streaming live video inputs:

  • AXIS Q7424-R Video Encoder
  • EPIPHAN VGADVI Broadcaster 99460 -

I am using gstreamer to view these streams on client terminals running linux. I am interested in the h264, rtp multicast streams (which both units support).

I can stream the Epiphan video using the following gstreamer pipeline: gst-launch-0.10 udpsrc multicast-group=ADDRESS port=PORT caps='application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264' ! rtph264depay ! ffdec_h254 ! autovideosink

However, this pipeline does not work for the Axis unit as I get the following error repeatedly:

ffmpeg:0:: non-existing PPS referenced
ffmpeg:0:: non-existing PPS 0 referenced
ffmpeg:0:: decode_slice_header error
ffmpeg:0:: no frame!
ffdec_h264: decoding error (len:-1, have_data: 0)

I have read that this error means that the ffmpeg decoder is missing the SPS/PPS information provided by a keyframe. The axis unit has a GOV parameter which is the interval at which i-frames are sent; it is set to 32.

Note that I can view both units' rtp streams in unicast with the following: gst-launch-0.10 rtspsrc location=rtsp://ADDRESS:PORT/... latency=100 ! rtph264depay ! ffdec_h264 ! autovideosink

Since unicast works and the unicast and multicast pipelines are the same (except for the source), my guess is either:

  • My udpsrc caps are simply incorrect for the axis stream (and I don't really know where/how to verify it)

  • or, the axis multicast format/encoding is different and requires a modification to the pipeline (I find this unlikely since unicast is working and I don't understand why the encoding would change between unicast/multicast).

Any suggestions are appreciated as I am limited by my knowledge of gstreamer and media formats in terms of what to try next.

RBI
  • 803
  • 2
  • 14
  • 25
  • what is an 'Axis unit' and 'GOV'? Do you mean 'access unit' and GOP? – szatmary Feb 10 '15 at 21:43
  • @szatmary - Axis unit just means the Axis encoder (it encodes video input for network streaming). I'm not 100% sure but I believe that GOV and GOP are the same thing in this case... I have read of GOP online but the setting for the Axis encoder, which in the user manual describes the same thing, is called GOV. – RBI Feb 10 '15 at 22:20
  • I have never heard of GOV. My guess is that the encoder is only producing SPS/PPS at the start of the stream, and not every I frame. in x264 the option for this is 'repeat_headers' But your encoder is a mystery to me. Sorry – szatmary Feb 10 '15 at 22:23
  • @szatmary - I believe your guess is correct. When I play the Axis stream in unicast, gstreamer gives the caps for the rtsp source. These caps have an "sprop-parameter-sets" key, which when added to the caps for multicast allows successful playback. I found Information on this property at http://stackoverflow.com/a/20656880/514041. If you want to expand on your guess in an answer I will accept it, you can probably explain it better than I. – RBI Feb 12 '15 at 13:24

1 Answers1

2

As stated in szatmary's comments, the axis hardware does not seem to stream the SPS/PPS information. I have contacted AXIS' support on this issue to which I received a response stating that my question is "outside of the scope of support staff".

The solution I have found was to include the "sprop-parameter-sets" in the receiving pipeline. This parameter seems to be unique per stream and can be obtained by either:

  • starting a unicast receiver with rtsp (example provided in question above) which will provide the set of caps that can be copied, or
  • accessing the .sdp file from the hardware, which is usually available through http (for example, http://<USERNAME:PASSWORD>@<ADDRESS:PORT>/axis-cgi/alwaysmulti.sdp?camera=1)

Note that accessing the sdp file is per stream (hence the camera=1), so if your hardware has multiple inputs then be sure to grab the right one.

RBI
  • 803
  • 2
  • 14
  • 25
  • Hello, many years later, I am still facing the same issue. Do you know if there is a way to make this work using `uridecodebin`? It internally initialized a `rtsp` stream but it doesn't work. It still works when initializing `rtsp` directly (but in this case I have issues with other streams). – user1315621 Jun 29 '22 at 17:20