title: GStreamer with MPEG-TS Video4Linux ATSC/DVB Recording
body: <p>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.</p>
  
  <p>How I made the recording:</p>
  
  <p>To tune the channel:</p>
  
  <pre><code>azap -c ~/channels.conf "Florida"
  </code></pre>
  
  <p>To record the channel: </p>
  
  <pre><code>cat /dev/dvb/adapter0/dvr0 &gt; /tmp/test
  </code></pre>
  
  <p>This is the way that recordings must be made (I can not use any GST DVB plugins to do this for me).</p>
  
  <p>I used tstools to identify that the recording is a TS stream:</p>
  
  <pre><code>tstools/bin$ ./stream_type ~/recordings/20130129-202049
  Reading from /home/dustin/recordings/20130129-202049
  It appears to be Transport Stream
  </code></pre>
  
  <p>...but that there are no PAT/PMT frames:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>I was able to produce a single ES (elementary stream) stream, by running ts2es:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>I am able to play the ES stream (even though the video is frozen on the first frame):</p>
  
  <pre><code>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
  </code></pre>
  
  <p>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:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>This tells us that the video stream has PID 0x61 (97).</p>
  
  <p>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.</p>
  
  <pre><code>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 ...
  </code></pre>
  
  <p>It fails [probably] because no PID has been specified with which to find the video (the "EOS" error, I think).</p>
  
  <p>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:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>Output:</p>
  
  <pre><code>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@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@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 ...
  </code></pre>
  
  <p>However, when I try mpegpsdemux (for program streams (PS), as opposed to transport streams (TS)), I get further:</p>
  
  <pre><code>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 ...
  </code></pre>
  
  <p>I'll still get the same problem whenever I use the mpegtsdemux, even if it follows mpegpsdemux, above.</p>
  
  <p>I don't understand this, since I haven't even picked a PID yet.</p>
  
  <p>What am I doing wrong?</p>
  
  <p>Dustin</p>