4台Linux Mint笔记本毫秒级时间同步与多屏视频分播技术咨询
嘿,这个四屏同步播放的需求我之前折腾过类似的,结合你已经用avplay搞定分块播放的基础,咱们来把同步脚本的部分完善好,实现精准的四屏联动:
四屏同步播放视频分块的bash脚本方案
第一步:先搞定系统时钟的基础同步
虽然你打算用单台机器的时间t作为基准,但四台机器的系统时钟不能差得太离谱,不然同步效果会直接崩。先在每台机器上做个简单的时钟校准:
sudo apt update && sudo apt install ntp sudo systemctl enable --now ntp
等个几分钟让时钟同步到位,这步是基础,别跳过哦。
第二步:生成同步播放的bash脚本
假设你选了其中一台作为「时间源机器」(比如叫master-node),先在这台机器上获取毫秒级时间t,然后生成四个分别对应四台机器的播放脚本。
1. 时间源机器上的核心脚本(生成+分发+触发)
写个generate_sync_scripts.sh脚本,它会完成时间计算、脚本生成、远程传输和批量启动的全流程:
#!/bin/bash # 获取当前毫秒级时间(转成毫秒,比秒级精准太多) current_ms=$(($(date +%s%N)/1000000)) # 设置3秒延迟启动,给所有机器留足脚本传输和准备时间 delay_ms=3000 start_time=$((current_ms + delay_ms)) # 循环生成4个播放脚本(对应4个视频分块,假设命名为video_1.mp4到video_4.mp4) for i in {1..4}; do cat << EOF > play_block_$i.sh #!/bin/bash # 循环等待到预设的启动时间,用usleep降低CPU占用 while true; do now_ms=\$(($(date +%s%N)/1000000)) if [ \$now_ms -ge $start_time ]; then break fi usleep 100 done # 启动avplay播放对应分块,记得替换成你之前测试有效的参数 # 比如加上-geometry指定窗口位置:左上角用-geometry 1920x1080+0+0,按需调整 avplay -x 1920 -y 1080 -display :0 video_$i.mp4 EOF chmod +x play_block_$i.sh done # 把脚本传到四台机器(替换成你的实际IP和用户名) scp play_block_1.sh your_username@192.168.1.101:/home/your_username/ scp play_block_2.sh your_username@192.168.1.102:/home/your_username/ scp play_block_3.sh your_username@192.168.1.103:/home/your_username/ scp play_block_4.sh your_username@192.168.1.104:/home/your_username/ # 远程触发所有脚本执行(后台运行避免阻塞) ssh your_username@192.168.1.101 "/home/your_username/play_block_1.sh &" ssh your_username@192.168.1.102 "/home/your_username/play_block_2.sh &" ssh your_username@192.168.1.103 "/home/your_username/play_block_3.sh &" ssh your_username@192.168.1.104 "/home/your_username/play_block_4.sh &"
2. 几个关键细节要注意
- 毫秒级时间计算:用
date +%s%N拿秒+纳秒,除以1000000转成毫秒,这是精准同步的核心,秒级时间根本不够用。 - 循环等待逻辑:用
usleep 100(每100微秒查一次时间),既能保证精度,又不会把CPU拉满。 - avplay窗口位置:如果要对应网格的四个角落,记得加
-geometry参数,比如你的屏幕是1920x1080,左上角就是-geometry 1920x1080+0+0,右上角-geometry 1920x1080+1920+0,以此类推,根据你的实际分辨率调整。
第三步:优化同步精度的小技巧
- 如果还是有细微不同步,可以把
usleep的时间调小到50微秒,但别太小,不然CPU占用会飙升。 - 测试前关闭每台机器的后台冗余程序,避免系统负载波动影响时间判断。
- 可以先播一段带同步音轨的测试视频,听声音是否同步,比看画面更容易判断效果。
常见问题解决
- ssh每次输密码麻烦:在时间源机器上生成ssh密钥,把公钥传到其他四台机器的
~/.ssh/authorized_keys里,就能免密登录了。 - 播放窗口位置不对:用
xrandr命令查看屏幕分辨率,再调整-geometry参数的数值。 - 时间偏差过大:如果四台机器时钟差超过几百毫秒,先重启ntp服务重新校准,或者在脚本里加入时钟偏移修正(先获取每台机器和时间源的时间差,再调整启动时间)。
内容的提问来源于stack exchange,提问作者Nisba




