如何将 KLV 元数据注入 MPEG-PS 文件

问题描述 投票:0回答:1

我需要创建一些软件,可以将 KLV 元数据注入到 Program Stream 文件中,请注意,我需要修改已经存在的文件,而不是通过 UDP 或类似内容的流。我尝试过在线搜索,但我不断提出有关如何将元数据插入传输流的解决方案。

我认为这就像根据 SCR 值按时间顺序创建一个新的包头 (

0x00 0x00 0x01 0xBA
) 一样简单。例如,如果我想在 00:00:10 添加元数据,我会在 00:00:09 和 00:00:11 之间插入数据包。

另请注意:我的数据包看起来类似于以下内容:

  • 使用有效的 SCR 打包标头 (
    0x00 0x00 0x01 0xBA
    )
  • 带有有效负载(即 KLV 元数据)的私有流 1 (
    0x00 0x00 0x01 0xBD
    )
  • 填充流 (
    0x00 0x00 0x01 0xBE
    ) 填充,直到总“包”为 2048 字节。

我已使用 MPEG PS Utils 应用程序进行验证,并且我的方法基于发现的示例 https://samples.ffmpeg.org/MPEG2/mpegts-klv/,使用与第一个 KLV 数据包相同的有效负载以日间航班示例发送。

mpeg-2 klvdata
1个回答
0
投票

您走在正确的道路上!将 KLV 元数据注入节目流 (PS) 文件涉及插入带有元数据有效负载的新数据包,同时保持整体结构和时序。以下是您的方法的详细说明和一些其他提示:

您目前的做法:

使用 0x00 0x00 0x01 0xBA 创建新的包头是正确的。这表示节目映射表(PMT),它通常携带有关 PS 内的流的信息。 在所需的 SCR 时间戳之间(例如,00:00:09 和 00:00:11 之间)插入数据包与 KLV 元数据在流中特定点的注入方式保持一致。

其他注意事项:

PID(数据包标识符):您可能需要为新创建的 PMT 数据包设置有效的 PID。该标识符将其与 PS 中的其他流区分开来。您可以从现有流中选择未使用的 PID 或参考 PS 规范以获取指导。

PMT 有效负载: 专用流 (0x00 0x00 0x01 0xBD) 可能不是 KLV 元数据的正确容器。 KLV 数据通常包含在节目映射信息 (PMI) 中,它是 PMT 有效负载的一部分。

FFmpeg 示例:您链接的 ffmpeg 示例(https://samples.ffmpeg.org/MPEG2/mpegts-klv/)为构建 KLV 有效负载本身提供了很好的参考。重点是传输流 (TS),但 PS 的 KLV 结构仍然相似。

这是注入 KLV 元数据的改进方法:

识别插入点:确定要插入元数据的确切 SCR 值。这将影响新数据包在 PS 文件中的放置。

选择 PID: 为新 PMT 数据包选择未使用的 PID。

制作 PMT 有效负载:在 PMT 有效负载中构建 PMI 部分来承载 KLV 数据。请参阅 PS 规范或 DVB 蓝皮书等资源 https://dvb.org/specifications/ 了解 PMI 结构详细信息。

计算数据包大小:考虑标头、带有 KLV 数据的 PMI 以及达到 188 字节(标准 PS 数据包大小)所需的任何填充,确定新数据包的总大小。

修改PS文件:使用十六进制编辑器之类的工具(小心!),将新制作的数据包插入到基于目标SCR值计算出的位置。确保整个流路中 SCR 值的连续性。

工具和资源:

PS 编辑工具: 考虑使用 libpsi (كбый амكты) (https://github.com/osu-crypto/libPSI) 等库或 M2TS(由 DVB 项目维护)等工具进行 PS 文件操作。与使用十六进制编辑器直接修改文件相比,这些提供了更安全的方法。

DVB 蓝皮书: 数字视频广播 (DVB) 项目提供 PS 和相关数字视频标准的规范:https://github.com/leandromoreira/digital_video_introduction 请记住,修改 PS 文件需要了解底层结构。如果这对您的需求来说很复杂,请考虑其他方法,例如容器格式(例如 MP4),它们可能提供更简单的元数据注入技术。

© www.soinside.com 2019 - 2024. All rights reserved.