libvlc - 在 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
后者尤其是如果我对更新频率有点疯狂。
我想知道是否有任何其他/更好的方法来实现这一目标?我想知道是否可能涉及某种计算,我可以这样做以使新费率与内部时间参考更好地对齐?第二个错误(“没有参考时钟”)让我认为内部某些东西被重新初始化,因为它暂时不可用。
非常感谢您的帮助。
解决方案
我得到了同样的错误,但通过调用 set_position`。正如您也注意到的那样,以低频调用该函数不会产生任何错误。
我不知道你的实现细节,但你可以使用代理来限制调用的频率。
就我而言,我看不到任何低于 30fps 的错误。
推荐阅读
- javascript - 如何在 vue js 中访问组件样式数组?
- java - 如何在这个库中显示动画 GIF?
- ios - UITableView Swift 中的多标题部分
- python - 在 Python 中检索较大字典的特定字典
- vue.js - Vue webpack encore sass 源图无法正常工作
- sql - 在修复字符后添加零/零,零的数量因 MSSQL 而异
- css - 我可以在样式化的 div 中绘制 SVG 路径吗?
- ios - 使用 React Native App 将默认设置为“方形 (1:1)”图像捕获和保存?
- html - 行未出现在活动/当前导航链接下
- javascript - 如何替换 UI 元素,而不是仅仅将它们添加到现有 UI。| JavaScript , 获取 API | DOM 操作