如何使用 ffmpeg 从 ts 中提取 "GROUP-ID"、"LANGUAGE" 和 "INSTREAM-ID"

How can I extract "GROUP-ID", "LANGUAGE" and "INSTREAM-ID" from ts using ffmpeg

我正在尝试从实时提要的片段中获取字幕。我是运行指挥部

ffmpeg -i seg-1077853030-v1-a1.ts

输出

`输入 #0,mpegts,来自 'seg-109853030-v1-a1.ts': 持续时间:00:00:06.01,开始:57867.901133,比特率:2649 kb/s 计划 1

Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, progressive), 1280x720 [SAR 1:1 DAR 16:9], Closed Captions, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
Stream #0:1[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 98 kb/s
Stream #0:2[0x102]: Data: timed_id3 (ID3  / 0x20334449)`

我的问题是我应该用什么命令 运行 打印出带有包括标签和语言在内的轨道元数据的字幕文件。

如果您的 MPEG-TS 文件是 HLS 片段,则只需解析 HLS 主播放列表以检索值。 如果您的输入是从直播中捕获的,请继续阅读。

  1. GROUP-ID

您可以在 HLS 播放列表中设置此值以指示再现组。

参见:https://www.rfc-editor.org/rfc/rfc8216#section-4.3.4.1.1

  1. LANGUAGE

这就是事情变得有点复杂的地方。

CEA-608 字幕不包含语言代码。

对于 CEA-708 和超过 708 的 608,这被指示为 ATSC 节目和系统信息协议 (PSIP) 表的一部分,应该出现在 PMT 和 EIT 中。

  • cc_type - 0 代表 608,1 代表 708
  • line21_field - 当 cc_type0 时:0 用于字段 1(包括通道 CC1 和 CC2),1 用于字段 2(其中包括频道 CC3 和 CC4)
  • caption_service_number - 当 cc_type1
  1. INSTREAM-ID

对于 CEA-608,这可以是 CC1CC2(字段 1)、CC3CC4(字段 2)——其中 CC1 和 CC2 携带主要语言的普通和 easy-reader 字幕以及次要语言的 CC3 和 CC4 - 或者以 SERVICEn 的形式用于 CEA-708 服务。

这些应该在 CSD 中公布(见上文),如果有的话。

我认为 FFmpeg 默认情况下不会提取这些信息,因此您需要扩展它或编写 MPEG-TS 解析器来检索信息。有一些用于解析 MPEG-TS 和处理字幕的库(例如:Whosebug 用户@szatmary 的 libcaption)。

如果您只想提取字幕,请使用 FFmpeg 或 ccextractor

如果您想手动执行此操作,可以使用 DVBInspector 等软件查看 PSI 内容: