首先,我为我糟糕的英语感到抱歉。我正在用C++编写视频流服务器。我有多个mpeg2-ts文件(电影和广告),我需要通过HTTP流作为一个单一的TS文件。问题是每个mpeg-ts文件都有自己的时间戳(PCR、PTS、DTS)。而且,据我所知,要进行连续的流式传输,每个新的PCR (PTS,DTS)值都应该从上一个PCR (PTS,DTS)值继续。
为了更好地理解我所说的内容,这里有一张图片:http://i.stack.imgur.com/vL1m6.png (我不能在消息中直接包含我的图片。对不起)
我需要更换pcr1, pcr2,pcr3 timestamps with the new ones. For example, I sent ts-packet containing the pcr3 timestamp and after a few more ts packets (not containing any value of PCR) I want to insert my advertisement. And my question is: how do I calculate the new values for pcr1,pcr2, pcr3等吗?
计算当前视频的比特率,然后将程序自上次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的规范,如果我有什么地方错了,请纠正我的错误。提前谢谢。希望你能理解我。
发布于 2013-05-13 19:04:04
Mpeg2“拼接”是一种艺术形式,比连接两个流复杂得多。它需要许多公司拥有专利的操作(http://www.google.com/patents/US6380991、http://www.google.com/patents/US6806909、http://www.google.com/patents/US6993081)
来回答你的一些问题:你对下一次pcr的计算看起来还不错,尽管你需要考虑到DTS/PTS的许多遵从性问题(例如etr290),你还有更多的工作要做。最基本的拼接将以这样的方式重新标记广告的pt/dts,即它们从第一个TS的最后一个时间戳继续。
ad first timestamp = last timestamp + frame interval诀窍在于确保在表示时间戳或解码时间戳中没有“漏洞”。这是比较困难的部分,需要对MPEG2 buffers (tstd,eb,mb)有深入的了解。
祝好运。
https://stackoverflow.com/questions/14620182
复制相似问题