Dob*_*007 3 c++ video mpeg video-streaming 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时间戳,我在这里读到这些时间戳可以是非线性的。相对于我收到的最后一个原始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
Run Code Online (Sandbox Code Playgroud)
我的程序可以读取和编辑mpeg-ts流中的这些时间戳。幸运的是,关于如何执行此操作的文献很多。但是,如何计算这些时间戳的新值?
我刚刚开始学习mpeg2-ts的规范,如果我在某些方面有误,请更正我的错误。提前致谢。希望你理解我。
Mpeg2“拼接”是一种艺术形式,比连接两个流要复杂得多。它需要众多公司专利的操作(http://www.google.com/patents/US6380991,http://www.google.com/patents/US6806909,http://www.google.com/patents/US6993081)
回答您的一些问题:尽管需要考虑DTS / PTS的许多兼容性问题(例如,etr290),但您对下一个pcr的计算似乎还可以,但是您还有很多工作要做。最基本的拼接将以这种方式重新加重广告的pts / dts,使其从第一个TS的最后一个时间戳继续。
ad first timestamp = last timestamp + frame interval
Run Code Online (Sandbox Code Playgroud)
诀窍在于确保演示时间戳或解码时间戳没有“漏洞”。这是困难的部分,需要深入了解MPEG2缓冲区(tstd,eb,mb)。
祝好运。