Como canalizar a saída do ffmpeg para o ffplay?

22

Como canalizar a saída de ffmpeg para ffplay?

No momento, eu uso uma solução alternativa no bash:

mkfifo spam
(ffplay spam 2> /dev/null &) ; capture /dev/stdout | ffmpeg -i - spam
wim
fonte

Respostas:

18

Não sei se é ffmpegque não é possível enviar seus dados para stdout ou ffplayque não é possível receber sua entrada de stdin.

Se for ffmpegque não pode enviar seus dados para stdout:

capture /dev/stdout | ffmpeg -i - >(ffplay 2> /dev/null)

(Você deve adicionar um -argumento para ffplayque ele receba sua entrada de stdin.)

Se for ffplayque não pode receber sua entrada do stdin:

ffplay <(capture /dev/stdout | ffmpeg -i -) 2> /dev/null

Para obter mais informações sobre <(command)e >(command)construção, consulte a seção Substituição de processo do manual do bash.

jfg956
fonte
4
para mim, isso não funcionou sem especificar explicitamente o formato de saída com "-f". conforme especificado em ffmpeg.org/ffmpeg.html : "o formato é normalmente detectado automaticamente para arquivos de entrada e calculado a partir da extensão do arquivo para arquivos de saída". em uma resposta dada, o ffmpeg não conseguirá adivinhar o formato de saída. então eu acho que o ffmpeg deveria ter "-f fmt" adicionado a ele.
Pavel K.
11
O ffmpeg 2.8.6 suporta a entrada stdin, como mencionado em outras respostas. Você pode verificar que o apoio com: stackoverflow.com/questions/12999674/...
Ciro Santilli新疆改造中心法轮功六四事件
17
ffmpeg -i input.avi <options> -f matroska - | ffplay -

vai funcionar; você precisa definir um formato de contêiner para a saída. Isso normalmente é definido com o ffmpeg olhando para a extensão que você fornece, mas aqui você deve configurá-lo manualmente -f. Eu recomendo o matroska (MKV) porque ele pode conter quase qualquer vídeo; portanto, o que quer que você esteja transcodificando deve funcionar perfeitamente.

Observe que se você estiver usando o Ubuntu 12.04, o ffmpeg foi substituído pelo fork do libav, e você deve usá avconv-lo avplay; a sintaxe é idêntica. Existe um tipo de ffmpeg lá, mas é prejudicado pelo design.

evilsoup
fonte
Win10: O erro ocorre como pipe:: Invalid data found when processing inputKno Power Shell, mas funciona bem no prompt de comando
John
11

O ffmpeg suporta operações de tubulação. Veja essa seção da documentação aqui .

Não sei como o ffplay funciona, mas para canalizar a saída do ffmpeg para a saída padrão, você pode adicionar o comando pipe ao final do comando ffmpeg. Exemplo:

ffmpeg -i input.flv pipe:1 | ffplay -i -
matzahboy
fonte
11
obrigado, de alguma forma perdi essa seção das páginas do manual .. no entanto, não consegui fazer essa construção funcionar, o nome do arquivo de saída precisa ser removido do ffmpeg e o canal de entrada adicionado aos argumentos do ffplay. i irá editar o seu post em conformidade ..
wim
Obrigado. Como eu disse, nunca usei o ffplay antes, mas eu sei o ffmpeg.
matzahboy
No meu caso man ffplay, não consigo ver o ffplaysuporte ao -iswitch - talvez seja ffmpegapenas?
Sdaau 29/05
11
pipe:1vs -? -funciona no ffmpeg 2.8.6.
Ciro Santilli escreveu
9

parece que os tubos normais funcionam (pelo menos no Windows):

ffmpeg -i sintel.mpg -pix_fmt yuv420p -f rawvideo - | ffplay -f rawvideo -pix_fmt yuv420p -s 720x480 -

ainda não tentei com entradas / saídas mais complicadas ...

ffmpeg -f dshow -i video=screen-capture-recorder -pix_fmt yuv420p -f mpegts - | ffplay -analyzeduration 10 -f mpegts -

é inicialização um pouco mais rápida

rogerdpack
fonte
5
Eu estava recebendo Unable to find a suitable output format for 'pipe:'- eu precisava especificar um codec com -f.
I336_
Funciona, mas com uma qualidade de imagem muito baixa
John
Se a qualidade da imagem for baixa, verifique se o que você está capturando inicialmente é de alta qualidade (salve-o primeiro em um arquivo etc.) "deve" ter qualidade normal ...
rogerdpack