Mplayerの2つのインスタンスを-upd-masterおよび-udp-slaveと同期しようとしていますが、マスターがループを新たに開始すると、スレーブが約1秒間よろめきます。
私はMPlayerSVN-r36545でdebian7.1を実行しています。これは、同じi7 8GBram 240GB SSDマシン(dhcpサーバーとして機能)で実行されている2つのビデオのコマンドです。
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
問題は-loop 0
私がスレーブで使用していたのは、実際にはマスターがその位置をブロードキャストして同期するのを待っていました。実際、私はmplayer開発者の1人である友人の一人と話をしましたが、彼は私がやりたいことは不可能だと言ってくれました。
したがって、私が使用することになったハックは、スレーブの現在の位置を常にチェックし、それが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つのファイルの期間がまったく同じで、同じコーデックを使用することが非常に重要です...