Gstreamer在E之前动态更改源

2024-10-02 04:23:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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


Tags: gt目标视频管道链接方式时间动态
1条回答
网友
1楼 · 发布于 2024-10-02 04:23:06

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

Concat完全按照您的要求在当前源的EOS上切换到另一个源。。Here就是一个很好的例子。在

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

还要检查这个answer在concat上已经有一个例子了。。但也要阅读评论。在

更新重新使用手动方式:

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

让我们想想视频部分。。在

你将为你想要播放的流(第一个)创建bin——假设你有uridecodibin,它将预卷整个内容并创建焊盘。。当你发现新的pad是video/x-raw时,你会在那里加上pad探针,然后插到videomixer上。在

然后过一段时间(可能的话)你会用另一个uridecodebin创建另一个bin(所以这是你假设的播放列表中的第二个“曲目”),然后再次进行预滚。当你得到这些垫子时,你不会把它们连接到视频混音器上,而是把整个事情都屏蔽掉(我觉得暂停一下就足够了)

当第一个进入EOS,然后你将启用第二个,在第一个你将刷新其余的视频。在

当然,你也会用音频做同样的事情。。在

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

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

相关问题 更多 >

    热门问题