将多个视频文件合并为一个 mpeg-ts 文件"on the fly"

Merging multiple video files into a single mpeg-ts file "on the fly"

本文关键字:文件 mpeg-ts 一个 fly on the 视频 合并      更新时间:2023-10-16

首先,对不起我的英语不好。我正在用C++编写视频流服务器。我有多个mpeg2-ts文件(电影和广告),我需要通过HTTP作为一个单一的TS-FILE进行流式传输。问题是每个mpeg-ts文件都有自己的时间戳(PCR,PTS,DTS)。而且,据我了解,要进行连续的流式传输,每个新的PCR(PTS,DTS)值都应该从最后一个PCR(PTS,DTS)值继续。

这是一张图片,以便更好地理解我在说什么:https://i.stack.imgur.com/vL1m6.png(我不能直接在消息中包含我的图片。对不起)

我需要用新的时间戳替换 pcr'1、pcr'2、pcr'3 时间戳。例如,我发送了包含 pcr3 时间戳的 ts 数据包,在再发送几个 ts 数据包(不包含任何 PCR 值)后,我想插入我的广告。我的问题是:如何计算 pcr'1、pcr'2、pcr'3 等的新值?

计算当前视频的比特率,然后将程序自上次 PCR 时间戳(在我们的例子中为 pcr3)以来发送的位数除以此比特率是否正确?我的意思是:(新时间戳)=(以前的时间戳)+(位数)/(比特率)。还是有更有效的方法?

至于PTS和DTS时间戳,我在这里读到这些时间戳可以是非线性的。相对于我收到的最后一个原始PCR计算它是否正确?我的意思是:

pts_new = (original_pts - last_original_pcr) + pcr_new. 
dts_new = (original_dts - last_original_pcr) + pcr_new. 
(original_pts - last_original_pcr) is the difference between pts and pcr values
pcr_new is the last modified pcr value

我的程序可以在 mpeg-ts 流中读取和编辑这些时间戳。幸运的是,有很多关于如何做到这一点的文献。但是如何计算这些时间戳的新值呢?

我刚刚开始学习mpeg2-ts的规范,如果我在某件事上出错了,请纠正我的错误。提前谢谢。希望你理解我。

Mpeg2 "拼接"是一种艺术形式,比连接两个流要复杂得多。它需要许多公司已获得专利的操作(http://www.google.com/patents/US6380991,http://www.google.com/patents/US6806909,http://www.google.com/patents/US6993081)

回答您的一些问题:您对下一个PCR的计算看起来不错,尽管您需要考虑许多合规性问题(例如ETR290)对于DTS/PTS,您还有更多的工作要做。 最基本的拼接将重新标记AD的PTS/DTS,以便它们从第一个TS的最后一个时间戳继续。

ad first timestamp = last timestamp + frame interval

诀窍在于确保在演示时间戳或解码时间戳中没有"漏洞"。这是困难的部分,需要深入了解MPEG2缓冲区(tstd,eb,mb)。

祝你好运。