Gstreamer在EOS

时间:2016-07-03 20:42:53

标签: python gstreamer

我尝试使用GStreamer 1.8.2和Python 3.5创建动态管道。目标是能够播放一些视频并在EOS上进行更改,以类似于使用播放器的即将完成的方式实现无间隙播放。

我的想法是filesrc - > decodebin - >队列 - > videoink,然后在decodebin视频src上放置一个探针,等待EOS事件,取消链接f​​ilesrc和decodebin,创建一个新的filesrc和一个新的decodebin广告,将它们设置为PLAYING状态后将它们链接到视频接收器。我不知道这是否是最佳/正确的方法,但据我所知它应该有效。

我的第一次尝试是this。播放对第一个循环工作正常,然后视频开始播放太快。我认为时间戳和/或流水线时钟存在一些问题,但我无法找到解决方案或更好地诊断问题。

编辑:在vaapisink中将max-lateness设置为-1,播放速度仍然更快但速度更快。所以这是一个时间问题。

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然后你将启用第二个,而在第一个你将刷新视频的其余部分。

你当然会对音频做同样的事情..

现在是棘手的部分 - 你必须将视频与音频对齐(音频更加正确,你比较时间戳,直到音频与视频匹配,你扔掉剩下的音频等) - 这是按顺序需要的不要失去同步。

这种方法很难做到。我做了一次,我们遇到了音频和视频同步的无限问题。