Como canalizar uma saída de comando para vários programas

3

Estou usando o FFmpeg e criei um aplicativo personalizado que é um servidor TCP. Eu estou usando saída duplicada no ffmpeg.

O que eu quero é que, para cada saída, eu queira iniciar meu programa para escutar em uma porta específica. Por exemplo, o que posso fazer agora:

ffmpeg -i "stream_link" -codec copy -f mpegts - \
    | myprogram -h 127.0.0.1 -p 12345 -f -

Meu programa pega os dados do ffmpeg e os armazena dentro do servidor. Agora, eu não posso fazer o seguinte

ffmpeg -i "stream_link" -codec copy -f mpegts - -codec copy -f flv - \
    | myprogram -h 127.0.0.1 -p 12345 -f - \
    | myprogram -h 127.0.0.1 -p 12345 -f -

Eu acho que você me pegou. Eu estou tentando saída 2 mpegts recipientes diferentes, flv e abra novamente 2 instâncias do meu programa. Então, como eu posso fazer isso?

Esta questão é apenas relacionada ao pipe. Acabei de dar um exemplo real usando o FFmpeg.

    
por user3393046 18.10.2014 / 18:33

1 resposta

4
ffmpeg -i "stream_link" -codec copy -f mpegts - -codec copy -f flv - |  
myprogram -h 127.0.0.1 -p 12345 -f - | 
myprogram -h 127.0.0.1 -p 12345 -f -

Então, se eu entendi corretamente, você está tentando combinar esses dois comandos em um.

mpegts formato

ffmpeg -i "stream_link" -codec copy -f mpegts - |  
myprogram -h 127.0.0.1 -p 12345 -f - 

flv formato

ffmpeg -i "stream_link"  -codec copy -f flv - |  
myprogram -h 127.0.0.1 -p 12345 -f -

Então, se meu entendimento acima estiver correto, acredito que você possa realizá-lo usando o comando tee . Você pode obter mais detalhes dessa questão aqui .

Então, você pode reformular seu comando como

 ffmpeg -i "stream_link" -codec copy -f mpegts - -codec copy -f flv - |  
 tee >(myprogram -h 127.0.0.1 -p 12345 -f -) 
     >(myprogram -h 127.0.0.1 -p 12346 -f -) 

No entanto, como o usuário mikeserv aponta em seus comentários,

ffmpeg está gravando dois fluxos em um arquivo. Tanto o mpegts quanto o flv vão para stdout , que é o | pipe.

Então, a solução teria que envolver ffmpeg escrevendo para dois arquivos distintos. algo como ffmpeg flv processing -o flvfile, mpegts processing -o mpegtsfile e os dois processos lendo as duas saídas.

Isso ou o processo que recebe a entrada teria que analisar a saída de ffmpeg para saber em qual offset começar a ler seus fluxos pretendidos.

Portanto, o problema com a abordagem tee é que tee poderia duplicar a entrada ffmpeg e dois ffmpeg poderiam ser usados.

Portanto, uma solução melhor para esse problema seria usar a abordagem como

{ { ffmpeg -i "stream_link"            #one input stream
        -codec copy -f flv /dev/fd/3   #duped and processed, out >&3
        -codec copy -f mpegts - |      #duped and processed, out >&1
        myprogram1 >&4                 #receives >&1 on <&0, out >&4
        } 3>&1 | myprogram2            #receives >&3 on <&0, out >&1
} 4>&1                                 #ensures both myprograms write to >&1

Quando usamos a abordagem acima, ffmpeg divide explicitamente sua saída. Isso depende de ser executado em um sistema que entende os links /dev/fd/[num] .

    
por 18.10.2014 / 19:11

Tags