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]
.