首页 > 解决方案 > 在 python-vlc 中-我如何“涂抹”播放速率以同步两个播放器?

问题描述

我正在尝试同步播放两个 VLC 实例。为此,我使用了 UDP 数据包。从次要玩家,我向主要玩家发送一个包含当前位置的数据包,主要玩家以当前位置回答。然后我使用这些信息来估计延迟。到目前为止,这一切正常,UDP 会话的总运行时间可以忽略不计(在同一主机上运行,​​大约为 0.00017 秒,在有线 LAN 连接上稍微多一点)。

当我尝试使辅助流排列时,麻烦就开始了。如果差异很大,我只是设置位置。这最终不是很精确,因为玩家需要一些时间来寻找新的位置。

因此,如果差异相对较小,我尝试将播放速率设置为稍快或稍慢,直到它们在同一帧上(即“应该”帧等于“是”帧)。问题是播放器也有点挂

        media_player.set_rate()

我尝试了更大的(1.2 / 0.9)值以及更小的(1.01 / 0.99),结果相似。

我也得到了很多:

[00007f6b8d9d7ab0] main decoder error: Timestamp conversion failed (delay 1000000, buffering 100000, bound 9000000)
[00007f6b8d9d7ab0] main decoder error: Could not convert timestamp 148752813836 for FFmpeg

和这个:

[00007f548002e180] main decoder error: Timestamp conversion failed for 41083001: no reference clock
[00007f548002e180] main decoder error: Could not convert timestamp 0 for FFmpeg

后者尤其是如果我对更新频率有点疯狂。

我想知道是否有任何其他/更好的方法来实现这一目标?我想知道是否可能涉及某种计算,我可以这样做以使新费率与内部时间参考更好地对齐?第二个错误(“没有参考时钟”)让我认为内部某些东西被重新初始化,因为它暂时不可用。

非常感谢您的帮助。

标签: libvlcpython-vlc

解决方案


我得到了同样的错误,但通过调用 set_position`。正如您也注意到的那样,以低频调用该函数不会产生任何错误。

我不知道你的实现细节,但你可以使用代理来限制调用的频率。

就我而言,我看不到任何低于 30fps 的错误。


推荐阅读