Python Gstreamer在EOS之前动态更改源

Python Gstreamer在EOS之前动态更改源,python,gstreamer,Python,Gstreamer,我正在尝试使用gstreamer1.8.2和python3.5创建一个动态管道。我们的目标是能够播放一些视频,并在EOS上进行更改,以类似于使用playbin的“即将完成”的方式实现无间隙播放 我的想法是filesrc->decodebin->queue->videosink,然后在decodebin视频src上放置一个探测器,等待EOS事件,取消filesrc和decodebin的链接,创建一个新的filesrc和一个新的decodebin,并在将它们设置为播放状态后将它们链接到视频接收器。我

我正在尝试使用gstreamer1.8.2和python3.5创建一个动态管道。我们的目标是能够播放一些视频,并在EOS上进行更改,以类似于使用playbin的“即将完成”的方式实现无间隙播放

我的想法是filesrc->decodebin->queue->videosink,然后在decodebin视频src上放置一个探测器,等待EOS事件,取消filesrc和decodebin的链接,创建一个新的filesrc和一个新的decodebin,并在将它们设置为播放状态后将它们链接到视频接收器。我不知道这是否是最好/正确的方法,但据我所知,它应该有效

我的第一次尝试是。第一个循环的播放效果良好,然后视频开始播放得太快。我认为在时间戳和/或管道时钟方面存在一些问题,但我无法找到解决方案或更好地诊断问题


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

那么我能告诉你什么-使用concat或视频混音器/音频混音器(我更喜欢concat方式)。。您不需要任何自定义解决方案:)

Concat做的正是您想要的,它会在当前源的EOS时切换到另一个源。。这是一个很好的例子

对于多个流(音频、视频、字幕…)来说有点棘手,然后需要合并流同步器或类似的东西

也请检查此项,concat上已经有一个示例。。但也要阅读评论

更新重新采用手动方式:

使用视频混音器和音频混音器有点棘手

让我们想想视频部分

您将为您想要播放的流创建bin(第一个)-假设您有一个bin,它将预滚整个内容并创建焊盘。。当你发现新的pad是video/x-raw时,你将在那里添加pad探头,并插入视频混合器

然后过一段时间(如果可能的话)你会用另一个uridecodebin创建另一个bin(这是你假设播放列表中的第二个“曲目”),然后再次进行预滚。当你拿到这些垫子时,你不会把它们连接到视频混合器上,而是把整个东西都堵住了(我认为暂停已经足够合适了)

当第一个启动EOS时,您将启用第二个,在第一个启动中,您将刷新视频的其余部分

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

现在,棘手的部分-你必须将视频与音频对齐(音频更大,你比较时间戳,直到音频与视频匹配,然后扔掉剩下的音频左右)-这是为了不失去同步所必需的


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

糟糕,昨天我在发布问题后发现了相同的页面,效果很好。你回答我自己的问题比我强。我倾向于接受你的答案,但我仍然想了解如何在不使用concat的情况下“手动”完成。