【问题标题】:Gstreamer dynamically change source before EOSGstreamer 在 EOS 之前动态更改源
【发布时间】:2016-11-21 23:31:19
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python gstreamer


    【解决方案1】:

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

    Concat 完全按照您的意愿进行操作,它会根据当前源的 EOS 切换到另一个源。Here 就是一个很好的例子。

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

    另外检查这个answer已经有一个关于concat的例子..但也阅读了cmets。

    更新关于手动方式:

    使用 videomixer 和 audiomixer 有点棘手。

    让我们想想视频部分..

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

    然后一段时间后(如果可能的话),您将使用另一个 uridecodebin 创建另一个 bin(因此这是您假设的播放列表中的第二个“曲目”)并再次进行预卷。当你得到垫子时,你不会将它们连接到 videomixer 而是阻止整个事情(我认为 PAUSED 足够合适)

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

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

    现在是棘手的部分 - 您必须将视频与音频对齐(音频更大,您比较时间戳,直到音频与视频匹配,然后您丢弃其余的音频左右) - 这是需要的不要不同步。

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

    【讨论】:

    • 哎呀,我昨天在发布问题后发现了相同的页面,它运行良好。你在回答我自己的问题时打败了我。我倾向于接受您的回答,但我仍然想了解如何在不使用 concat 的情况下“手动”完成。
    猜你喜欢
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2019-09-16
    • 2021-11-01
    • 1970-01-01
    • 2020-07-11
    相关资源
    最近更新 更多