problems with muxers

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

problems with muxers

alex
Hello,
 
I'm having a lot of trouble getting any of the gstreamer muxers to work properly.  Using ubuntu packages for now (eventually I'll need windows too).  There seems to be some differences between 0.10 and 1.0 but I can't get either to really work.  Sorry for the long post, I'm trying to include as many details as I can.

Here are some examples:

gst-launch-1.0 filesrc location=input.mp4 ! qtdemux ! h264parse ! mpegtsmux ! filesink location=output.ts
Input is 75MB, output is 78MB.  File does not play in VLC or Windows Media Player or ffplay.  ffplay prints out a ton of "non-existing PPS referenced / non-existing PPS 0 referenced / decode_slice_header error / no frame!".

The same pipeline, with gst-launch-0.10, outputs a file which plays in VLC and ffplay but not WMP.



Another example:

gst-launch-0.10 filesrc location=input.ts ! tsdemux ! h264parse ! ffdec_h264 ! ffmpegcolorspace ! videoscale ! autovideosink
This plays fine.  There is a slight delay at the beginning because the first keyframe is about a 1 second into the video.  gstreamer 0.10, VLC, ffplay, WMP all behave the same way.

BUT, if I use gstreamer 1.0, like this:
gst-launch-1.0 filesrc location=input.ts ! tsdemux ! h264parse ! avdec_h264 ! videoconvert ! videoscale ! autovideosink
Then it starts playing immediately, with the first second garbled.



Another example:

gst-launch-0.10 filesrc location=input.ts ! tsdemux ! h264parse ! video/x-h264, stream-format=avc, alignment=au, width=720, height=480, framerate=30/1 ! qtmux ! filesink location=output.mov

I get the following error:

ERROR: from element /GstPipeline:pipeline0/GstTSDemux:tsdemux0: Internal data stream error.
Additional debug info:
mpegtsbase.c(1639): mpegts_base_loop (): /GstPipeline:pipeline0/GstTSDemux:tsdemux0:stream stopped, reason not-negotiated
ERROR: pipeline doesn't want to preroll.

I looked in the debug output and I see:
0:00:00.535047886  9175      0x2737050 WARN                   qtmux gstqtmux.c:3098:gst_qt_mux_video_sink_set_caps:<qtmux0> no codec_data in h264 caps
0:00:00.535075250  9175      0x2737050 WARN                   qtmux gstqtmux.c:3251:gst_qt_mux_video_sink_set_caps:<qtmux0> pad video_00 refused caps video/x-h264, stream-format=(string)avc, alignment=(string)au, parsed=(boolean)true, width=(int)720, height=(int)480, framerate=(fraction)30/1



Why is the codec_data not set in the caps by the ts demuxer or the h264 parser?  What can I do to retrieve the codec_data?

With 1.0 I get a similar problem but it doesn't print out a warning about no codec_data... it does however have some other  warnings like:

0:00:00.022590652  9201      0x1db4980 WARN                GST_PADS gstpad.c:3582:gst_pad_peer_query:<capsfilter0:src> pad has no peer

Setting pipeline to PAUSED ...
0:00:00.023023022  9201      0x1db4980 WARN                GST_PADS gstpad.c:3582:gst_pad_peer_query:<h264parse0:sink> pad has no peer

Pipeline is PREROLLING ...
0:00:00.024118386  9201      0x1dacd40 WARN              mpegtsbase mpegtsbase.c:548:mpegts_base_program_add_stream: Stream already present !

0:00:00.024235204  9201      0x1dacd40 WARN                 tsdemux tsdemux.c:1318:gst_ts_demux_queue_data: Didn't get the first packet of this PES
/GstPipeline:pipeline0/GstH264Parse:h264parse0.GstPad:sink: caps = video/x-h264, stream-format=(string)byte-stream, alignment=(string)nal

0:00:00.025333582  9201      0x1dacd40 WARN       codecparsers_h264 gsth264parser.c:1106:gst_h264_parser_parse_pic_timing: didn't get the associated sequence paramater set for the current access unit

0:00:00.025368192  9201      0x1dacd40 WARN       codecparsers_h264 gsth264parser.c:1154:gst_h264_parser_parse_pic_timing: error parsing "Picture timing"
0:00:00.025469794  9201      0x1dacd40 WARN       codecparsers_h264 gsth264parser.c:1792:gst_h264_parser_parse_slice_hdr: couldn't find associated picture parameter set with id: 0
/GstPipeline:pipeline0/GstH264Parse:h264parse0.GstPad:src: caps = video/x-h264, stream-format=(string)avc, alignment=(string)au, parsed=(boolean)true

0:00:00.025706252  9201      0x1dacd40 WARN              mpegtsbase mpegtsbase.c:1639:mpegts_base_loop:<tsdemux0> error: Internal data stream error.

0:00:00.025724310  9201      0x1dacd40 WARN              mpegtsbase mpegtsbase.c:1639:mpegts_base_loop:<tsdemux0> error: stream stopped, reason not-negotiated
ERROR: from element /GstPipeline:pipeline0/GstTSDemux:tsdemux0: Internal data stream error.




I also get the same error when trying to mux to avi, matroska.  I *CAN* mux it into mpeg-ps, which works perfectly in WMP, VLC, etc.


Recording from an rtsp stream has similar results - With 0.10, I can mux into mpegts using rtspsrc ! gstrtpjitterbuffer ! rtph264depay ! h264parse ! mpegtsmux ! filesink  - the results are not playable in WMP, but are playable in ffmpeg and VLC.  However, with 1.0, the results are not playable in anything - ffplay reports "Could not find codec parameters (Video: h264)" as well as a ton of non-existing PPS errors.

Surprisingly, muxing rtsp -> mp4 gives a perfect video which can be played in WMP, VLC, ffplay... but I don't know why ts -> mp4 doesn't work like that?

I thought as long as I had parsed h.264 video in the correct stream format and alignment, it should go into mp4/mov, ps, ts, avi, or mkv without issue.  But it seems it sometimes needs more info - codec parameters? - and I can't figure out what to give it.  I tried setting all the caps that the documentation says the muxers want, but they didn't mention anything about codec_params.

So... anyone know what I'm missing?

Alex