繁体   English   中英

Gstreamer在EOS之前动态更改源

[英]Gstreamer dynamically change source before EOS

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

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

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

编辑:在vaapisink中将max-lateness设置为-1,其回放速度仍然更快,但速度却慢得多。 因此,这是一个时间问题。

好吧,我能告诉您-使用concat或videomixer / audiomixer(我更喜欢concat方式)..您不需要任何自定义解决方案:)

Concat确实可以按照您希望的方式在当前源的EOS上切换到另一个源。 是一个很好的示例。

如果要处理多个流(音频,视频,字幕等),则比较棘手,那么您需要合并流同步器或类似此处所述的内容。

还检查此答案 ,已经有关于concat的示例了。但是也请阅读注释。

更新以手动方式进行:

使用videomixer和audiomixer有点棘手。

让我们考虑视频部分。

您将为要播放的流(第一个)创建bin-假设您在那里有uridecodebin,它将预滚动整个内容并创建pads ..当您发现新的pads是video / x-raw时,您将添加将探头垫在那里,然后插入Videomixer。

然后一段时间(如果可能的话),您将使用另一个uridecodebin创建另一个bin(因此这是您的假设播放列表中的第二个“音轨”),并再次对此进行预滚动。 当您获得打击垫时,您无需将其连接至Videomixer而是将整个物体挡住(我认为PAUSED足够合适)

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

当然,您将对音频做同样的事情。

现在最棘手的部分-您必须将视频与音频对齐(音频的大小更大,您需要比较时间戳,直到音频与视频匹配,然后丢弃其余的音频等等)-为了避免这种情况,这是必需的不同步。

这种方法很难做到。我曾经做过一次,我们在音频和视频同步方面存在无限的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM