3

首先,对不起我糟糕的英语。我正在用 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的规范,如有错误请指正。提前致谢。希望你能理解我。

4

1 回答 1

5

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

回答您的一些问题:您对下一个 pcr 的计算看起来不错,尽管您需要考虑 DTS/PTS 的许多合规性问题(例如 etr290),但您还有很多工作要做。最基本的拼接只会重新标记广告的 pts/dts,使其从第一个 TS 的最后一个时间戳继续。

ad first timestamp = last timestamp + frame interval

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

祝你好运。

于 2013-05-13T11:04:04.470 回答