Gstreamer在EOS之前动态更改源代码

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

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

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

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


那么我能告诉你什么 - 使用concat或videomixer / audiomixer(我更喜欢concat的方式)..你不需要任何定制的解决方案:)

Concat完全按照你想要的切换到当前源的EOS上的另一个源。这里有个很好的例子。

它更复杂的多流(音频,视频,字幕..)你需要合并流同步或类似的东西在这里..

还检查这个答案已经有一个例子concat ..但也阅读评论。

UPDATE拒绝手动方式:

使用videomixer和audiomixer它有点棘手。

让我们想想视频部分..

您将为您想要播放的流(第一个)创建bin - 让我们说你有uridecodebin,它将预先整理所有东西并创建一个pad。当你发现新的pad是视频/ x-raw时,你将添加在那里放置探针并插入视频混合器。

然后一段时间(如果可能的话),您将使用另一个uridecodebin创建另一个bin(所以这是您的假设播放列表中的第二个“轨道”),并且再次执行此操作。 当你拿到手柄时,你不会将它们连接到视频混合器,但会阻止整个事情(我认为PAUSED已经够用了)

当第一个使用EOS时,您将启用第二个,在第一个中您将清空视频的其余部分。

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

现在这个棘手的部分 - 您必须将视频与音频对齐(音频更具预测性,比较时间戳,直到音频与视频匹配,然后丢弃其余音频等) - 这是为了不走不同步。

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

链接地址: http://www.djcxy.com/p/60175.html

上一篇: Gstreamer dynamically change source before EOS

下一篇: 1.2.2 : simple pipeline with decklinksink doesn't output raw video