首先,对不起我糟糕的英语。我正在用 C++ 编写视频流服务器。我有多个 mpeg2-ts 文件(电影和广告),我需要通过 HTTP 将它们作为一个 TS-FILE 流式传输。问题是每个 mpeg-ts 文件都有自己的时间戳(PCR、PTS、DTS)。而且,据我了解,要进行连续的流式传输,每个新的 PCR(PTS,DTS)值都应该从上一个 PCR(PTS,DTS)值继续。
这是一张图片,可以更好地理解我所说的:http: //i.stack.imgur.com/vL1m6.png(我不能直接在消息中包含我的图片。抱歉)
我需要用新的时间戳替换 pcr`1、pcr`2、pcr`3 时间戳。例如,我发送了包含 pcr3 时间戳的 ts-packet,在再发送几个 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的规范,如有错误请指正。提前致谢。希望你能理解我。