我需要创建一些软件,可以将 KLV 元数据注入到 Program Stream 文件中,请注意,我需要修改已经存在的文件,而不是通过 UDP 或类似内容的流。我尝试过在线搜索,但我不断提出有关如何将元数据插入传输流的解决方案。
我认为这就像根据 SCR 值按时间顺序创建一个新的包头 (
0x00 0x00 0x01 0xBA
) 一样简单。例如,如果我想在 00:00:10 添加元数据,我会在 00:00:09 和 00:00:11 之间插入数据包。
另请注意:我的数据包看起来类似于以下内容:
0x00 0x00 0x01 0xBA
)0x00 0x00 0x01 0xBD
)0x00 0x00 0x01 0xBE
) 填充,直到总“包”为 2048 字节。我已使用 MPEG PS Utils 应用程序进行验证,并且我的方法基于发现的示例 https://samples.ffmpeg.org/MPEG2/mpegts-klv/,使用与第一个 KLV 数据包相同的有效负载以日间航班示例发送。
您走在正确的道路上!将 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),它们可能提供更简单的元数据注入技术。