[ffmpeg] ffmpeg 提取多节目TS文件中的单节目

一、 通过节目号提取

1.1 获取节目号

要获取 TS 文件中的节目信息,可以使用 ffmpeg 命令:

ffmpeg input.ts

运行该命令后,您将看到类似以下的输出:

......
[mpegts @ 0x7c60800] stream 0 : no PTS found at end of file, duration not set
[mpegts @ 0x7c60800] stream 2 : no PTS found at end of file, duration not set
[mpegts @ 0x7c60800] stream 3 : no PTS found at end of file, duration not set
Input #0, mpegts, from 'input.ts':
  Duration: 00:01:11.11, start: 1494.371989, bitrate: 19965 kb/s
  Program 7 
    Metadata:
      service_name    : ETC7
      service_provider: DVT
  Stream #0:0[0x92]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(top first), 720x576 [SAR 12:11 DAR 15:11], 25 fps, 25 tbr, 90k tbn
  Stream #0:1[0x93](eng): Audio: mp2 (mp3float) ([4][0][0][0] / 0x0004), 48000 Hz, mono, fltp, 128 kb/s (clean effects)
  Program 8 
    Metadata:
      service_name    : ETC8
      service_provider: DVT
  Stream #0:3[0xa2]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(top first), 720x576 [SAR 12:11 DAR 15:11], 25 fps, 50 tbr, 90k tbn
  Stream #0:2[0xa3]: Audio: mp2 (mp3float) ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 128 kb/s

可以看到 input.ts 文件中包含两个节目:Program 7 和 Program 8。

也可以直接使用以下命令过滤当前输入的节目

ffmpeg -i input.ts 2>&1 | grep Program

可以直接获取当前存在的节目号:

  Program 7 
  Program 8 

以提取节目7的文件为例:

1.2 通过节目号提取节目

ffmpeg -i input.ts -map 0:p:7 -c copy output_program7.ts

可以获得节目7的文件,储存到output_program7.ts中

1.3 参数解析

  • -i input.ts: 指定输入文件为 input.ts。
  • -map 0:p:7: 这是关键参数,用于 节目映射。它表示从第一个输入文件(索引为 0)中选择 Program(p)号为 7 的所有流。ffmpeg 会自动包含该节目下的所有视频、音频和其他数据流。
  • -c copy: 指定流的编码方式为 copy,即 ffmpeg 直接复制原始数据而不重新编码。
  • output_program7.ts: 指定输出文件名为 output_program7.ts。

二、通过 stream id 提取

2.1 获取stream id

直接使用ffmpeg命令获取

ffmpeg input.ts

输出结果与之前相同:

Input #0, mpegts, from 'input.ts':
  Duration: 00:01:11.11, start: 1494.371989, bitrate: 19965 kb/s
  Program 7 
    Metadata:
      service_name    : ETC7
      service_provider: DVT
  Stream #0:0[0x92]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(top first), 720x576 [SAR 12:11 DAR 15:11], 25 fps, 25 tbr, 90k tbn
  Stream #0:1[0x93](eng): Audio: mp2 (mp3float) ([4][0][0][0] / 0x0004), 48000 Hz, mono, fltp, 128 kb/s (clean effects)
  Program 8 
    Metadata:
      service_name    : ETC8
      service_provider: DVT
  Stream #0:3[0xa2]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(top first), 720x576 [SAR 12:11 DAR 15:11], 25 fps, 50 tbr, 90k tbn
  Stream #0:2[0xa3]: Audio: mp2 (mp3float) ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 128 kb/s

继续以提取 Program 7 为例。从输出中我们可以看到,Program 7 包含两个流:

  • 视频流:Stream #0:0[0x92],pid为0x92(146)
  • 音频流:Stream #0:1[0x93],pid为0x93(147)

它们的stream ID 分别是 0:0 和 0:1。

2.2 根据stream号提取

使用以下 ffmpeg 命令根据流 ID 提取 Program 7 的视频和音频流:

ffmpeg -i input.ts -map 0:0 -map 0:1 -c copy output_program7.ts

2.3 参数解析

  • -i input.ts: 指定输入文件为 input.ts。
  • -map 0:0: 映射 第一个输入文件(索引 0)的第一个流(索引 0),即 Program 7 的视频流。
  • -map 0:1: 映射 第一个输入文件(索引 0)的第二个流(索引 1),即 Program 7 的音频流。
  • -c copy: 指定流的编码方式为 copy,不进行重新编码。
  • output_program7.ts: 指定输出文件名为 output_program7.ts。
posted on 2025-07-21 14:54  风惊庭前叶  阅读(38)  评论(0)    收藏  举报