0

我有一个不可能的时间来设置一个过滤图来读取我从我的 DVB video4linux 设备制作的录音。任何帮助将不胜感激。

我是如何录制的:

调谐频道:

azap -c ~/channels.conf "Florida"

录制频道:

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

这是必须进行录制的方式(我不能使用任何 GST DVB 插件来为我做到这一点)。

我使用 tstools 来识别录制的是 TS 流:

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

...但是没有 PAT/PMT 帧:

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

通过运行 ts2es,我能够生成单个 ES(基本流)流:

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

我能够播放 ES 流(即使视频在第一帧被冻结):

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

但是,无论我做什么,我都无法打开原始 TS 文件。但是,它完美地在 Mplayer/FFMPEG 中打开(但不是 VLC)。这是 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

这告诉我们视频流的 PID 为 0x61 (97)。

我已经尝试了几天,所以以下只是一些尝试的示例。我将首先提供 playbin2 示例,因为我知道成千上万的人会做出回应,坚持我只是使用它。它不起作用。

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 ...

它[可能]失败了,因为没有指定用于查找视频的 PID(我认为是“EOS”错误)。

自然地,我尝试了以下从解复用 TS 格式开始。我相信这是在没有 PMT 信息的情况下接收 PID 的“es-pids”属性(上面 tstools 说没有),但我也尝试了“程序编号”,以防万一。gst-inspect 表示一个是十六进制,另一个是十进制:

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

输出:

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 ...

但是,当我尝试 mpegpsdemux(用于程序流 (PS),而不是传输流 (TS))时,我会走得更远:

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 ...

每当我使用 mpegtsdemux 时,我仍然会遇到同样的问题,即使它遵循上面的 mpegpsdemux。

我不明白这一点,因为我什至还没有选择 PID。

我究竟做错了什么?

达斯汀

4

1 回答 1

0

答对了。

事实证明,这个问题主要是由 MPEG-TS 广播流的典型无效帧引起的。通过首先通过 mencoder 运行 TS 文件来重建它(没有重新编码),playbin2 突然工作了:

mencoder 20130129-202049 -oac copy -ovc copy -o 20130129-202049.copy

正如 mpegtsdemux 的作者告诉我的,flutsdemux 是较新的,应该比旧的 mpegtsdemux 更受欢迎。flutsdemux 也可以更好地处理这些格式错误的帧。

编辑

不幸的是,这是不正确的。mencoder 虽然被指示复制流,但将其重新打包为 AVI,而不是将其保留为 MPEGTS:

$ gst-discoverer-1.0 ~/capture_0051_WXEL.dvb.distill
Analyzing file:///home/dustin/capture_0051_WXEL.dvb.distill
Done discovering file:///home/dustin/capture_0051_WXEL.dvb.distill

Topology:
  container: Audio Video Interleave (AVI)
    audio: AC-3 (ATSC A/52)
    video: MPEG-2 Video

Properties:
  Duration: 0:00:12.696016666
  Seekable: yes
  Tags: 
      encoder: MEncoder svn r34540 (Ubuntu), built with gcc-4.7
      container format: AVI
      audio codec: AC-3 audio
      bitrate: 384000
      video codec: MPEG 2 Video

话虽如此,当我从空中录制时,看起来 PMT 数据包不存在。mplayer/mencoder 似乎可以解决这个问题,而 GStreamer 和 VLC 却在数据上窒息。当我使用同一设备记录 ATSC/NTSC 电缆馈送时,PMT 数据包如预期的那样存在。您可以使用“tstools”包中的“tsreport”确定某些数据包类型的存在:

OTA 提要:

$ tsreport -v capture_20130621-0402.trunc | grep PMT
!!! 60 bytes ignored at end of file - not enough to make a TS packet

电缆馈电:

$ tsreport -v capture_20130621-1118.ntsc.qam256.Florida.dvb | grep PMT
   31960: TS Packet 171 PID 0230 [pusi] PMT
   73508: TS Packet 392 PID 0230 [pusi] PMT
  101520: TS Packet 541 PID 0230 [pusi] PMT
  164688: TS Packet 877 PID 0230 [pusi] PMT

希望这可以节省一些时间。我受够了。

于 2013-01-31T07:34:51.523 回答