如何使用 mplayer 和 upd 同步两个循环视频?

如何使用 mplayer 和 upd 同步两个循环视频?

我正在尝试使用 -upd-master 和 -udp-slave 同步 mplayer 的两个实例,并注意到当主服务器重新开始循环时,从服务器会交错大约一秒钟。

我正在运行带有 MPlayer SVN-r36545 的 debian 7.1,下面是针对在同一台 i7 8GBram 240GB SSD 机器(充当 dhcp 服务器)上运行的两个视频的命令:

mplayer -vo xv -udp-master -udp-ip 10.42.0.255 -loop 0 Videos/HDV_0537.MP4
mplayer -vo xv -udp-slave -loop 0 Videos/HDV_0538.MP4

答案1

这实际上非常棘手,因为问题在于-loop 0我一直在从属设备上使用的实际上是在等待主设备广播其位置并同步。事实上,我与我的一位 mplayer 开发人员朋友交谈过,他告诉我我想做的事情是不可能的。

所以我最终使用的方法是不断检查从属设备的当前位置,并且当它到达 EOF 时,在特定的睡眠时间后重新启动文件 - 我必须手动调整...

首先设置主机使用如下命令:

mplayer -udp-master -udp-ip 10.42.0.255 masterVideo.mp4 -loop 0

对于从属我使用了以下脚本:

#!/bin/bash

fifo="/tmp/fifo"

rm -rf $fifo
mkfifo $fifo

mplayer -nocache -slave -fixed-vo -idle -udp-ip 10.42.0.255 -udp-slave -udp-seek-threshold 0.5 -osdlevel 0 -input file=$fifo >$fifo.answer "slaveVideo.mp4" &

somepid=$!
echo $somepid

function getpos() {
    local newpos=none
    while ! [[ "$newpos" =~ ANS_TIME ]]; do
        echo "get_time_pos" > $fifo
        newpos=$(tail -n 1 $fifo.answer)
        [[ "$newpos" =~ "EOF code: 1" ]] && { pos=-1; echo > $fifo.answer; return; } 
        pos=${newpos#ANS_TIME_POSITION=}
    done
    pos=${pos#0}
    pos2=$(echo "$pos + 0.14" | bc )
    printf "%.2f" "$pos2"
} 

function getlen() {
    local newlen=none
    while ! [[ "$newlen" =~ ANS_LENGTH ]]; do
        echo "get_time_length" > $fifo
        newlen=$(tail -n 1 $fifo.answer)
        len=${newlen#ANS_LENGTH=}
        sleep 0.1
    done
    len=${len#0}
    echo ${len}
}

len=$(getlen)

while true; do
    pos=$(getpos)
    if [[ $pos == $len ]]
        then
            # YOU MUST TWEAK THE FOLLOWING
            # SLEEP TIME FOR YOUR MACHINE
            sleep 0.5
            echo "loadfile /media/media/1.mp4" > $fifo
        fi
done

顺便说一句,我使用的是已编译的 mplayer - 而不是 mplayer2。暂停功能运行得非常顺畅,跳过功能也是如此...但是,两个文件的持续时间完全相同并使用相同的编解码器非常重要...

答案2

首先我要感谢你。我已经在多显示器中使用 mplayer 近 15 年了。我根本无法让它工作,而且我在互联网上找不到任何可以工作的方法。这感觉太荒谬了,为什么没有人想到这一点?

伙计,你的脚本竟然成功了,我简直不敢相信,这么久之后竟然成功了!非常感谢!我将其编写到 masterVideo 和 slavedVideo 文件中,我将命令行参数添加到文件中,这样我就可以使用电影名称调用 masterVideo 和 slavedVideo。我还将 -volume 0 添加到从属脚本中,因为声音有回声。虽然很粗糙,很老套,但确实有效!

在同一台电脑上运行良好...我现在正尝试通过网络使用此脚本,但目前它只能在同一台电脑上运行。有没有办法使用 IP 地址通过网络启动从属视频?当我尝试时,只有当主服务器和从属服务器在同一台机器上时,它才有效。以下是确切的错误


armel@shiva:~/tmp$ ../bin/slavedVideo movie.avi
76666
do_connect: could not connect to socket
connect: No such file or directory
Failed to open LIRC support. You will not be able to use your remote 
control.
[mpeg4 @ 0x7f63c469c380]Requested frame threading with a custom         
get_buffer2() implementation which is not marked as thread safe. This is 
not supported anymore, make your callback thread-safe.
(standard_in) 1: illegal character: _
(standard_in) 1: syntax error
^C

MPlayer interrupted by signal 2 in module: sleep_timer

我搜索了一下,最后在 .mplayer/config 文件中加入了 lirc=no,然后电影开始暂停,但从不同步,然后我就收到这个错误。电影是完全相同的文件。


armel@shiva:~/tmp$ ~/bin/slavedVideo movie.avi 
936655
[mpeg4 @ 0x7fdb253d7380]Requested frame threading with a custom     
get_buffer2() implementation which is not marked as thread safe. This is 
not supported anymore, make your callback thread-safe.
^C
MPlayer interrupted by signal 2 in module: calc_sleep_time

所以我添加了解决方案,但网络不起作用……是否需要一些额外的设置才能使其在网络上正常工作?两台机器都通过 ssh 连接良好。我知道这篇文章是很久以前的事了,我想我还是会尝试一下。你已经做了非常有帮助,谢谢。:)

相关内容