¿Cómo puedo canalizar la salida de ffmpeg a ffplay?

21

¿Cómo puedo canalizar la salida de ffmpeg a ffplay?

En este momento uso una solución alternativa en bash:

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

Respuestas:

18

No sé si es ffmpegque no puede enviar sus datos a stdout, o ffplaysi no puede tomar su entrada de stdin.

Si es ffmpegeso, no puede enviar sus datos a stdout:

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

(Migth necesita agregar un -argumento para ffplayque tome su entrada de stdin).

Si es ffplayasí, no puede tomar su entrada de stdin:

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

Para obtener más información sobre la construcción <(command)y >(command), consulte la sección Sustitución de procesos del manual bash.

jfg956
fuente
44
para mí esto no funcionó sin especificar explícitamente el formato de salida con "-f". como se especifica en ffmpeg.org/ffmpeg.html : "el formato normalmente se detecta automáticamente para los archivos de entrada y se adivina desde la extensión del archivo para los archivos de salida". en la respuesta dada, ffmpeg no podrá adivinar el formato de salida. así que creo que ffmpeg debería tener "-f fmt" agregado.
Pavel K.
1
ffmpeg 2.8.6 admite entrada stdin como se menciona en otras respuestas. Puede verificar ese soporte con: stackoverflow.com/questions/12999674/…
Ciro Santilli 新疆 改造 中心 996ICU 六四 事件
16
ffmpeg -i input.avi <options> -f matroska - | ffplay -

trabajará; necesita establecer un formato contenedor para la salida. Esto normalmente se configura con ffmpeg mirando la extensión que le da a la salida, pero aquí debe configurarlo manualmente con -f. Recomiendo matroska (MKV) porque puede contener casi cualquier video, por lo que sea lo que sea que esté transcodificando debería funcionar perfectamente bien.

Tenga en cuenta que si está usando Ubuntu 12.04, ffmpeg ha sido reemplazado por la bifurcación libav, y debe usar avconvy en su avplaylugar; La sintaxis es idéntica. Hay una especie de ffmpeg allí, pero está lisiado por diseño.

maldad
fuente
Win10: se produce un error como pipe:: Invalid data found when processing inputKen Power Shell, pero funciona bien en el símbolo del sistema
John
11

ffmpeg admite operaciones de tuberías. Vea esa sección de la documentación aquí .

No sé cómo funciona ffplay, pero para canalizar la salida de ffmpeg a la salida estándar, puede agregar el comando de tubería al final del comando ffmpeg. Ejemplo:

ffmpeg -i input.flv pipe:1 | ffplay -i -
matzahboy
fuente
1
gracias, de alguna manera me perdí esa sección de las páginas del manual ... sin embargo, no pude lograr que esta construcción funcionara, el nombre de archivo de salida debe eliminarse de ffmpeg y la tubería de entrada agregada a ffplay args.
editaré
Gracias. Como dije, nunca he usado ffplay antes, pero sé ffmpeg.
matzahboy
En mi man ffplay, no puedo ver el ffplaysoporte del -iinterruptor, ¿es quizás ffmpegsolo?
sdaau
1
pipe:1vs -? -funciona en ffmpeg 2.8.6.
Ciro Santilli 中心 改造 中心 996ICU 六四 事件
9

parece que las tuberías normales funcionan (al menos en ventanas):

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

aunque no lo he probado con entradas / salidas más complicadas ...

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

es un inicio un poco más rápido

rogerdpack
fuente
44
Estaba obteniendo Unable to find a suitable output format for 'pipe:', necesitaba especificar un códec con -f.
i336_
Funciona, pero muy baja calidad de imagen
John
Si la calidad de imagen es baja, asegúrese de que lo que está capturando inicialmente sea de alta calidad de imagen (guárdelo primero en un archivo, etc.) "debería" ser de calidad normal ...
rogerdpack