我尝试使用GStreamer 1.8.2和Python 3.5创建动态管道。目标是能够播放一些视频并在EOS上进行更改,以类似于使用播放器的即将完成的方式实现无间隙播放。
我的想法是filesrc - > decodebin - >队列 - > videoink,然后在decodebin视频src上放置一个探针,等待EOS事件,取消链接filesrc和decodebin,创建一个新的filesrc和一个新的decodebin广告,将它们设置为PLAYING状态后将它们链接到视频接收器。我不知道这是否是最佳/正确的方法,但据我所知它应该有效。
我的第一次尝试是this。播放对第一个循环工作正常,然后视频开始播放太快。我认为时间戳和/或流水线时钟存在一些问题,但我无法找到解决方案或更好地诊断问题。
编辑:在vaapisink中将max-lateness设置为-1,播放速度仍然更快但速度更快。所以这是一个时间问题。
答案 0 :(得分:3)
那么我能告诉你什么 - 使用concat或videomixer / audiomixer(我更喜欢concat方式)..你不需要任何自定义解决方案:))
Concat完全按照你想要的方式在当前源的EOS上切换到另一个源。Here就是很好的例子。
对于多个流(音频,视频,字幕......)来说,它更加棘手,然后您需要合并流同步器或与here类似的东西..
同时检查这个answer已经有一个关于concat的例子..但也阅读了评论。
更新重新考虑手动方式:
使用videomixer和audiomixer有点棘手。
让我们考虑视频部分..
你将为你想要播放的流创建bin(第一个) - 假设你有uridecodebin那里将预卷整个东西并创建垫...当你发现新的垫是视频/ x-raw你将在那里添加pad探针并插入videomixer。
然后一段时间后(如果可能的话)你将创建另一个bin与另一个uridecodebin(所以这是第二个" track"在你的假设播放列表中)并再次做这个的预卷。当你拿到打击垫时,你没有将它们连接到视频混合器但阻挡整个事物(我认为PAUSED足够合适)
当第一个进入EOS然后你将启用第二个,而在第一个你将刷新视频的其余部分。
你当然会对音频做同样的事情..
现在是棘手的部分 - 你必须将视频与音频对齐(音频更加正确,你比较时间戳,直到音频与视频匹配,你扔掉剩下的音频等) - 这是按顺序需要的不要失去同步。
这种方法很难做到。我做了一次,我们遇到了音频和视频同步的无限问题。