Como reproduzir um filme ouvindo duas trilhas sonoras simultaneamente?

10

Eu tenho arquivos de filme com várias faixas de áudio (no contêiner MKV). Quero assistir a um filme enquanto envio um idioma para os alto-falantes (para as crianças) e outro para os fones de ouvido (para mim), mantendo as faixas sincronizadas se o filme estiver em pausa etc.

Suponha que meu sistema já tenha duas saídas de áudio configuradas corretamente.

Existe uma maneira de fazer isso com um media player no Linux? Até agora, verifiquei o MPlayer e o VLC e eles oferecem suporte apenas à seleção de uma das faixas de áudio disponíveis.

Martin Vidner
fonte
11
Você está fazendo uma pergunta fora do tópico (compra de software). Perguntas que procuram recomendações de produtos, serviços ou materiais de aprendizagem não são abordadas. Veja no tópico . Tente softwarerecs.stackexchange.com, mas leia primeiro o que é necessário para que uma pergunta contenha "informações suficientes" .
DavidPostill
Talvez você possa recodificar o arquivo, combinando os dois fluxos de áudio em um. Portanto, se um é 5.1 e o outro é estéreo, você teria um fluxo de 8 canais. Você pode mapear esses canais para diferentes dispositivos de saída usando o Soundflower no OS X, mas eu não sei sobre o Linux. Parece muito inconveniente. Você também pode usar algo como o Adobe Premiere ou outro NLE para mapear diferentes faixas de áudio para diferentes saídas.
Elliott B.
Receio que as "crianças" já tenham aprendido a outra língua ... pelo menos espero. :-)
Hastur 10/10
Você também pode misturar as faixas de áudio em estéreo, colocá-las todas em uma faixa de áudio 5.1 (ignorando os canais central / subwoofer) e depois agrupá-las novamente no filme. Em seguida, você pode reproduzi-lo em qualquer placa de som 5.1, basta conectar fones de ouvido e alto-falantes na saída apropriada.
JonasCz - Restabelece Monica

Respostas:

3

A ideia

aka Como quebrar uma mosca (manteiga) no volante [ Fly ] .

Você pode transmitir localmente o filme inteiro com todas as faixas de áudio e legendas, por exemplo, com vlc.
Então será "suficiente" conectar dois clientes a esse fluxo, selecionando o idioma (e / ou legendas) e a saída de áudio diferente (que assumimos já configurada).

Além disso, com uma nova televisão, tablet ou celular, não é necessário executar os clientes no computador ... e quando você coloca em pausa a serpentina, coloca tudo em pausa ... e deve funcionar com janelas também (sempre assumido a saída de áudio já configurada talvez com programas de terceiros, caso você queira executar os dois clientes no computador).

Algumas palavras mais

Uma linha de comando típica de streaming pode ser semelhante a

vlc "movie.mkv" --sout-all --sout="#rtp{dst=239.255.100.100,port=5004,mux=ts}"

É necessária a opção --sout-all [ SO ]

 --sout-all, --no-sout-all  Enable streaming of all ES (default disabled)
 Stream all elementary streams (video, audio and subtitles) (default disabled)

Leia vlc -Hpara ter algumas dicas para as outras (toneladas de) opções disponíveis.

Para "reproduzir" o fluxo

vlc rtp://239.255.100.100:5004  --audio-track=x

onde x é o número do fluxo de áudio que você deseja ouvir nesse cliente.
Tudo também deve ser feito facilmente a partir da GUI do servidor / cliente ...

Referências e leituras adicionais
Você pode ler mais na página de blog do Luuk "Use o VLC para reproduzir vários videoclipes em vários computadores em sincronia" [ 1 ] , você pode tentar adicionar uma faixa de áudio externa a partir desta página wiki do videolan [ 2 ] , ou você pode jogar com o Gstreamer e com saídas diferentes, conforme sugerido por Antonio nesta resposta [ 3 ] .

GStreamer:
# O número e a ordem das faixas devem ser conhecidos…

gst-launch-1.0 \
filesrc location=example.mkv ! decodebin name=decoded \
decoded.src_0 ! queue ! autovideosink \
decoded.src_1 ! queue ! audioconvert ! alsasink device=”hw:1,0″ \
decoded.src_2 ! queue ! audioconvert ! alsasink device=”hw:2,0″

O comando Gstreamer acima pode ser uma resposta mínima de trabalho por si só ou um caminho para salvar a mosca (manteiga) ...
... mas raramente estou tentado a defender meu próprio apelido.

Hastur
fonte
Observe que o IP do RST precisa estar no intervalo 224.0.0.0 a 239.255.255.255 (intervalo de IP de difusão seletiva) ou você não poderá conectar mais do que cliente a ele. Parece que qualquer IP desse tipo funcionará.
Chx 07/04/19
@chx Deixe-me saber se a idéia funciona com o seu outro assunto ...
Hastur
Sim! Eu escrevi superuser.com/a/1422462/41259, mas achei que esse detalhe valia a pena mencionar aqui.
Chx 07/04/19
0

A solução de streaming tem uma desvantagem - os clientes usam cache e podem ficar fora de sincronia. Isso aconteceu comigo.

Outra abordagem para executar duas faixas diferentes simultaneamente, que eu achei útil, é executar duas instâncias do VLC e sincronizar sua reprodução. Mas não posso ser feito corretamente sem a automação (ações manuais feitas uma por uma que causam atrasos).

A solução é controlar as duas instâncias do VLC de forma síncrona usando a interface da web. Pode ser ativado via GUI ou console:

vlc --extraintf=http --http-host 127.0.0.1 --http-port 8081 --http-password any_password

Para cada instância do VLC, use portas diferentes. Para controlar a reprodução, basta um comando - faça uma pausa na alternância: http://:[email protected]:8081/requests/status.xml?command=pl_pause"

Mais informações sobre comandos.

Nesse caso, tudo o que você precisa fazer é criar um programa / script que envie uma solicitação HTTP para os dois URIs simultaneamente. Eu escrevi um programa golang muito simples para ele (aqui está o código fonte ). JS é outro bom candidato para esse fim. Indo além, é possível fazer mais comandos, atribuir associações de teclas globais a esse programa / script.

O ponto principal de que a abordagem funciona bem.

Valera Leontyev
fonte