Como sincronizar dois vídeos em loop com o mplayer e upd?

1

Estou tentando sincronizar duas instâncias de mplayer com -upd-master e -udp-slave, e percebo que o escravo cambaleia por cerca de um segundo quando o mestre inicia o loop novamente.

Estou executando o debian 7.1 com o MPlayer SVN-r36545 e aqui estão os meus comandos para os dois vídeos em execução na mesma máquina SSD i7 8GBram de 240 GB (atuando como um servidor 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
    
por denjello 08.05.2014 / 12:54

1 resposta

1

Isso foi realmente complicado, porque o problema era que o -loop 0 que eu estava usando no escravo estava realmente esperando que o mestre transmitisse sua posição e sincronizasse. Na verdade, conversei com um dos meus amigos que era um dos desenvolvedores do mplayer e ele me disse que o que eu queria fazer era impossível.

Então, o hack que acabei usando foi verificar constantemente a posição atual do escravo e, assim como o EOF, reiniciar o arquivo depois de um pouco específico de sono - o qual eu tive que sintonizar manualmente ...

Primeiro, para configurar o mestre, use isto:

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

Para o escravo, usei o seguinte script:

#!/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

A propósito, estou usando um mplayer compilado - não o mplayer2. Pausa funciona muito bem, como pular ... No entanto, é muito importante que os dois arquivos tenham exatamente a mesma duração e usem os mesmos codecs ...

    
por 05.08.2014 / 12:44