¿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

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.


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.


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 -

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.