Как синхронизировать два циклических видео с mplayer и upd?

Я пытаюсь синхронизировать два экземпляра mplayer с-upd-master и-udp-slave, и замечаю, что slave шатается примерно на секунду, когда мастер начинает цикл заново.

Я запускаю debian 7.1 с mplayer SVN-r36545 и вот мои команды для двух видео, работающих на одной машине SSD i7 8GBram 240GB (действующей как сервер 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
5
задан denjello
11.12.2022 22:03 Количество просмотров материала 3375
Распечатать страницу

1 ответ

Это было на самом деле очень сложно, потому что проблема была в том, что -loop 0 я использовал на ведомом устройстве на самом деле ждал мастера, чтобы транслировать свою позицию и синхронизировать. На самом деле я поговорил с одним из моих друзей, который был одним из разработчиков mplayer, и он сказал мне, что то, что я хочу сделать, невозможно.

так Хак, что я в конечном итоге с помощью было постоянно проверять текущее положение ведомого и так же, как он попадает в EOF перезапуска файла после определенного бита сна - который мне пришлось настраивать вручную...

во-первых, чтобы настроить мастер использовать это:

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

для slave я использовал следующий скрипт:

#!/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. Пауза работает очень чисто, как и пропустить... Однако очень важно, чтобы эти два файла имели одинаковую длительность и использовали одинаковые кодеки...

1
отвечен denjello 2022-12-13 05:51

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх