将多个视频文件合并为一个 mpeg-ts 文件"on the fly"
Merging multiple video files into a single mpeg-ts file "on the fly"
首先,对不起我的英语不好。我正在用C++编写视频流服务器。我有多个mpeg2-ts文件(电影和广告),我需要通过HTTP作为一个单一的TS-FILE进行流式传输。问题是每个mpeg-ts文件都有自己的时间戳(PCR,PTS,DTS)。而且,据我了解,要进行连续的流式传输,每个新的PCR(PTS,DTS)值都应该从最后一个PCR(PTS,DTS)值继续。
这是一张图片,以便更好地理解我在说什么:https://i.stack.imgur.com/vL1m6.png(我不能直接在消息中包含我的图片。对不起)
我需要用新的时间戳替换 pcr'1、pcr'2、pcr'3 时间戳。例如,我发送了包含 pcr3 时间戳的 ts 数据包,在再发送几个 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的规范,如果我在某件事上出错了,请纠正我的错误。提前谢谢。希望你理解我。
Mpeg2 "拼接"是一种艺术形式,比连接两个流要复杂得多。它需要许多公司已获得专利的操作(http://www.google.com/patents/US6380991,http://www.google.com/patents/US6806909,http://www.google.com/patents/US6993081)
回答您的一些问题:您对下一个PCR的计算看起来不错,尽管您需要考虑许多合规性问题(例如ETR290)对于DTS/PTS,您还有更多的工作要做。 最基本的拼接将重新标记AD的PTS/DTS,以便它们从第一个TS的最后一个时间戳继续。
ad first timestamp = last timestamp + frame interval
诀窍在于确保在演示时间戳或解码时间戳中没有"漏洞"。这是困难的部分,需要深入了解MPEG2缓冲区(tstd,eb,mb)。
祝你好运。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 是否可以解密受 cenc 保护的 MPEG-DASH 文件?
- 在Visual Studio中更新Qt翻译(.ts文件)时出现未指定错误
- 如何使用 cmake 来确保 C++14 编译器与实验文件系统 TS 库的链接?
- 从编码域中的 MPEG 文件中读取元数据
- 是否可以从一系列路径迭代器或子路径创建文件系统 TS basic_path
- 更改ffmpeg中的mpeg ts pid值
- 用Qt初始化ts文件
- Clangs c++ Module TS支持:如何告诉clang++在哪里找到模块文件
- 我如何在MFC中播放' mpeg '文件
- 正在从PAT部分(MPEG-TS)读取信息
- C++Taglib封面艺术从MPEG 4文件
- Qt翻译:在ts文件中,对于“确定”、“保存”、“取消”等标准按钮,我应该使用什么上下文
- 将多个视频文件合并为一个 mpeg-ts 文件"on the fly"