A reprodução de sincronização do Mplayer não funciona para mais de dois vídeos localmente

2

Estou usando o Mplayer para reproduzir quatro vídeos (de segurança) em sincronia local.

Para o primeiro vídeo, estou em execução:

mplayer -udp-master -udp-ip 192.168.0.255 1_01_R_072018150000.avi

Para cada um dos vídeos subsequentes que estou executando:

mplayer -udp-slave -udp-ip 192.168.0.255 1_02_R_072018150000.avi
mplayer -udp-slave -udp-ip 192.168.0.255 1_03_R_072018150000.avi
mplayer -udp-slave -udp-ip 192.168.0.255 1_04_R_072018150000.avi

Todos os vídeos estão sendo executados na mesma máquina. Eu só quero avançar rapidamente em sincronia.

A coisa é: apenas o primeiro escravo joga em sincronia com o mestre. Os outros dois começam congelados no primeiro quadro e permanecem assim por 10 ou 15 segundos. Depois disso, a reprodução começa fora de sincronia com os outros.

Qualquer ajuda? Desde já, obrigado.

Edit: Esta é a saída do segundo escravo, pelos primeiros 20 segundos ou mais, enquanto o mestre e o primeiro dos escravos estão funcionando bem e em sincronia.

mplayer -udp-slave -udp-ip 192.168.0.255 1_04_R_072018150000.avi 

MPlayer 1.3.0 (Debian), built with gcc-6.2.1 (C) 2000-2016 MPlayer Team
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.

Playing 1_04_R_072018150000.avi.
libavformat version 57.56.101 (external)
Mismatching header version 57.56.100
AVI file format detected.
[aviheader] Video stream found, -vid 0
[aviheader] Audio stream found, -aid 1

Badly interleaved AVI file detected - switching to -ni mode...
AVI: No audio stream found -> no sound.
VIDEO:  [H264]  704x576  24bpp  25.000 fps  1214.6 kbps (148.3 kbyte/s)
Failed to open VDPAU backend libvdpau_i965.so: cannot open shared object file: No such file or directory
[vdpau] Error when calling vdp_device_create_x11: 1
[VO_XV] Could not grab port 110.
[VO_XV] Could not grab port 111.
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
libavcodec version 57.64.101 (external)
Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
Load subtitles in ./
==========================================================================
Opening audio decoder: [alaw] aLaw/uLaw audio decoder
AUDIO: 8000 Hz, 1 ch, s16le, 64.0 kbit/50.00% (ratio: 8000->16000)
Selected audio codec: [alaw] afm: alaw (aLaw)
==========================================================================
AO: [pulse] 8000Hz 1ch s16le (2 bytes per sample)
Starting playback...
Movie-Aspect is undefined - no prescaling applied.
VO: [xv] 704x576 => 704x576 Planar YV12 
A:   0.0 V:   0.0 A-V:  0.000 ct:  0.000   1/  1 ??% ??% ??,?% 0 0 
    
por Rodrogo 17.07.2018 / 02:47

1 resposta

0

Documentação do MPlayer diz:

Setting -udp-ip to the master's broadcast address allows multiple slaves having the same broadcast address to sync to the master.

Eu acho que normalmente esses escravos devem rodar em máquinas diferentes. O fluxo de rede de transmissão pode chegar a muitas máquinas, mas no contexto de cada máquina, o fluxo fica vinculado a um único processo de audição.

Existe uma maneira de vários processos receberem o mesmo fluxo (compare esta resposta minha , reuseaddr ) mas parece-me que mplayer não o usa.

Consegui resolver o problema no Linux com socat , tee e bash . Como você precisa executar vídeos localmente, vamos nos ater a 127.0.0.1 ; nós nem precisamos de transmissão.

O primeiro comando é como o que você usou:

mplayer -udp-master -udp-ip 127.0.0.1 video0.avi

Em seguida, execute um pipe que bifurcará o fluxo recebido (nota: 23867 é a porta padrão usada por mplayer ):

socat UDP-LISTEN:23867 - | tee >(socat - UDP-DATAGRAM:127.0.0.1:20001) >(socat - UDP-DATAGRAM:127.0.0.1:20002) >/dev/null

Isso reenviará os dados recebidos para as portas 20001 e 20002 . Você pode adicionar >(socat - UDP-DATAGRAM:127.0.0.1:20003) e mais portas, se quiser.

Com esta execução, o escravo mplayer -s pode vincular-se independentemente, cada um à sua própria porta:

mplayer -udp-slave -udp-ip 127.0.0.1 -udp-port 20001 video1.avi
mplayer -udp-slave -udp-ip 127.0.0.1 -udp-port 20002 video2.avi
…
    
por 20.07.2018 / 23:46

Tags