Playing MPEG-TS Video4Linux ATSC/DVB Recording

Dustin Oprea myselfasunder at gmail.com
Wed Jan 30 07:41:23 PST 2013


I'm having an impossible time setting up a filtergraph to read from a
recording that I made from my DVB video4linux device. Any help would be
vastly appreciated.

How I made the recording:

To tune the channel:

azap -c ~/channels.conf "Florida"


To record the channel:

cat /dev/dvb/adapter0/dvr0 > /tmp/test


This is the way that recordings must be made (I can not use any GST plugins
to do this for me).

I used tstools to identify that the recording is a TS stream:

tstools/bin$ ./stream_type ~/recordings/20130129-202049
Reading from /home/dustin/recordings/20130129-202049
It appears to be Transport Stream


...but that there are no PAT/PMT frames:

tstools/bin$ ./tsinfo ~/recordings/20130129-202049
Reading from /home/dustin/recordings/20130129-202049
Scanning 10000 TS packets

Found 0 PAT packets and 0 PMT packets in 10000 TS packets


I was able to produce a single ES (elementary stream) stream, by running
ts2es:

tstools/bin$ ./ts2es -pid 97 ~/recordings/20130129-202049 ~/recordings/
20130129-202049.es
Reading from /home/dustin/recordings/20130129-202049
Writing to   /home/dustin/recordings/20130129-202049.es
Extracting packets for PID 0061 (97)
!!! 4 bytes ignored at end of file - not enough to make a TS packet
Extracted 219258 of 248113 TS packets


I am able to play the ES stream (even though the video is frozen on the
first frame):

gst-launch-0.10 filesrc location=~/recordings/20130129-202049.es !
decodebin2 ! autovideosink
gst-launch-0.10 filesrc location=~/recordings/20130129-202049.es !
decodebin2 ! xvimagesink
gst-launch-0.10 playbin2 uri=file:///home/dustin/recordings/
20130129-202049.es


No matter what I do, though, I can't get the original TS file to open.
However, it opens in Mplayer/FFMPEG, perfectly (but not VLC). This is the
output of FFMPEG:

ffmpeg -i 20130129-202049

ffmpeg version 0.8.5-4:0.8.5-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the
Libav developers
  built on Jan 24 2013 18:03:14 with gcc 4.6.3
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a
future release. Please use avconv instead.
[mpeg2video @ 0x9be7be0] mpeg_decode_postinit() failure
    Last message repeated 4 times
[mpegts @ 0x9be3aa0] max_analyze_duration reached
[mpegts @ 0x9be3aa0] PES packet size mismatch
Input #0, mpegts, from '20130129-202049':
  Duration: 00:03:39.99, start: 9204.168844, bitrate: 1696 kb/s
    Stream #0.0[0x61]: Video: mpeg2video (Main), yuv420p, 528x480 [PAR
40:33 DAR 4:3], 15000 kb/s, 30.57 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0.1[0x64]: Audio: ac3, 48000 Hz, stereo, s16, 192 kb/s
At least one output file must be specified


This tells us that the video stream has PID 0x61 (97).

I have been trying for a few days, so the following are only examples of a
couple of attempts. I'll provide the playbin2 example first, since I know
that thousands of people will respond, insisting that I just use that. It
doesn't work.

gst-launch-0.10 playbin2 uri=file:///home/dustin/recordings/20130129-202049

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
ERROR: from element
/GstPlayBin2:playbin20/GstURIDecodeBin:uridecodebin0/GstDecodeBin2:decodebin20/GstMpegTSDemux:mpegtsdemux0:
Could not determine type of stream.
Additional debug info:
gstmpegtsdemux.c(2931): gst_mpegts_demux_sink_event ():
/GstPlayBin2:playbin20/GstURIDecodeBin:uridecodebin0/GstDecodeBin2:decodebin20/GstMpegTSDemux:mpegtsdemux0:
No valid streams found at EOS
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...


It fails [probably] because no PID has been specified with which to find
the video (the "EOS" error, I think).

Naturally, I tried the following to start by demuxing the TS format. I
believe it's the "es-pids" property that receives the PID in the absence of
PMT information (which tstools said there weren't any, above), but I tried
"program-number", too, just in case. gst-inspect indicates that one is hex
and the other is decimal:

gst-launch-0.10 -v filesrc location=20130129-202049 ! mpegtsdemux
es-pids=0x61 ! fakesink

gst-launch-0.10 -v filesrc location=20130129-202049 ! mpegtsdemux
program-number=97 ! fakesink


Output:

gst-launch-0.10 filesrc location=20130129-202049 ! mpegtsdemux es-pids=0x61
! fakesink
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
ERROR: from element /GstPipeline:pipeline0/GstMpegTSDemux:mpegtsdemux0:
Could not determine type of stream.
Additional debug info:
gstmpegtsdemux.c(2931): gst_mpegts_demux_sink_event ():
/GstPipeline:pipeline0/GstMpegTSDemux:mpegtsdemux0:
No valid streams found at EOS
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...
dustin at dustinmicro:~/recordings$ gst-launch-0.10 -v filesrc
location=20130129-202049 ! mpegtsdemux es-pids=0x61 ! fakesink
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
ERROR: from element /GstPipeline:pipeline0/GstMpegTSDemux:mpegtsdemux0:
Could not determine type of stream.
Additional debug info:
gstmpegtsdemux.c(2931): gst_mpegts_demux_sink_event ():
/GstPipeline:pipeline0/GstMpegTSDemux:mpegtsdemux0:
No valid streams found at EOS
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...
dustin at dustinmicro:~/recordings$ gst-launch-0.10 -v filesrc
location=20130129-202049 ! mpegtsdemux es-pids=0x61 ! fakesink
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
ERROR: from element /GstPipeline:pipeline0/GstMpegTSDemux:mpegtsdemux0:
Could not determine type of stream.
Additional debug info:
gstmpegtsdemux.c(2931): gst_mpegts_demux_sink_event ():
/GstPipeline:pipeline0/GstMpegTSDemux:mpegtsdemux0:
No valid streams found at EOS
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...


However, when I try mpegpsdemux (for program streams (PS), as opposed to
transport streams (TS)), I get further:

gst-launch-0.10 filesrc location=20130129-202049 ! mpegpsdemux ! fakesink

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...

(gst-launch-0.10:14805): GStreamer-CRITICAL **:
gst_event_new_new_segment_full: assertion `position != -1' failed

(gst-launch-0.10:14805): GStreamer-CRITICAL **: gst_mini_object_ref:
assertion `mini_object != NULL' failed

(gst-launch-0.10:14805): GStreamer-CRITICAL **: gst_pad_push_event:
assertion `event != NULL' failed
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock

(gst-launch-0.10:14805): GStreamer-CRITICAL **:
gst_event_new_new_segment_full: assertion `position != -1' failed

(gst-launch-0.10:14805): GStreamer-CRITICAL **: gst_mini_object_ref:
assertion `mini_object != NULL' failed

(gst-launch-0.10:14805): GStreamer-CRITICAL **: gst_pad_push_event:
assertion `event != NULL' failed

(gst-launch-0.10:14805): GStreamer-CRITICAL **:
gst_event_new_new_segment_full: assertion `position != -1' failed

(gst-launch-0.10:14805): GStreamer-CRITICAL **: gst_mini_object_ref:
assertion `mini_object != NULL' failed

(gst-launch-0.10:14805): GStreamer-CRITICAL **: gst_pad_push_event:
assertion `event != NULL' failed

(gst-launch-0.10:14805): GStreamer-CRITICAL **:
gst_event_new_new_segment_full: assertion `position != -1' failed

(gst-launch-0.10:14805): GStreamer-CRITICAL **: gst_mini_object_ref:
assertion `mini_object != NULL' failed

(gst-launch-0.10:14805): GStreamer-CRITICAL **: gst_pad_push_event:
assertion `event != NULL' failed


...


Got EOS from element "pipeline0".
Execution ended after 1654760008 ns.
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...



I'll still get the same problem whenever I use the mpegtsdemux, even if it
follows mpegpsdemux, above.

I don't understand this, since I haven't even picked a PID yet.


What am I doing wrong?

Dustin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20130130/8f2e2e00/attachment-0001.html>


More information about the gstreamer-devel mailing list