将多个视频文件合并到一个mpeg-ts文件中“即时”

时间:2013-01-31 07:02:45

标签: c++ video video-streaming mpeg mpeg2-ts

首先,抱歉我的英语不好。我正在用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时间戳,我读到here这些时间戳可以是非线性的。相对于我收到的最后一次原始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的规格,如果我错了,请纠正我的错误。 提前致谢。希望你能理解我。

1 个答案:

答案 0 :(得分:4)

Mpeg2“拼接”是一种艺术形式,并且比连接两个流要复杂得多。它需要许多公司获得专利的操纵(http://www.google.com/patents/US6380991http://www.google.com/patents/US6806909http://www.google.com/patents/US6993081

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

ad first timestamp = last timestamp + frame interval

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

祝你好运。