Reducir las deficiencias en la línea de comando causadas por un número excesivo de entradas FFmpeg

0

Durante mucho tiempo he usado un script que hace concatenación para diferentes códecs usando filtros complejos como se describe aquí .

Este wiki da el siguiente comando de ejemplo:

ffmpeg -i input1.mp4 -i input2.webm -i input3.mov \
-filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mkv

Mi problema es que si tienes muchos clips pequeños que necesitan combinarse de esta manera, esto se escalará desastrosamente.

Si bien para este ejemplo parece que el filtro complejo es el causante de problemas, la presión para esto puede reducirse a una carga constante mediante el uso de -filter_complex_script que pone toda la cadena de filtro en un archivo externo, que se escala perfectamente.

Por lo tanto, el único problema que queda son los archivos de entrada. No alcanzaría este límite con tanta facilidad si no estuviera limitado por las diferentes rutas y los largos nombres de archivos generados automáticamente, pero esos están fuera de mi control para cambiar. Desafortunadamente, mi situación ha crecido hasta donde los 8,000 caracteres impares que Windows me ofrece no son suficientes.

Entonces, lo que busco es (aproximadamente) algo así como un script de archivo de entrada. He visto menciones de la concat demuxer Eso tiene algo en ese sentido, pero no puedo entender cómo funcionaría. Por lo que puedo decir, tiraría todo en una sola entrada de archivo y haría imposible ejecutar la concatenación de script de filtro complejo. Sin mencionar: el enlace wiki anterior menciona claramente que debe ser el mismo códec, base de tiempo, etc. para todos los archivos, lo que no se aplica a mi situación.

¿Cómo me deshago de mis preocupaciones sobre la longitud de la línea de comando y me olvido para siempre de lo que se conoce como limitaciones de caracteres en la línea de comando?

Stigma
fuente
Si no puede usar el demolidor de concat, le sugiero que ejecute un script por lotes para crear enlaces abreviados en un directorio para todos los archivos en el orden de entrada deseado. y luego suministre esos nombres como entradas a ffmpeg.
Gyan
Si el problema está relacionado con las limitaciones de la línea de comandos, puede valer la pena buscarlo para resolverlo mediante programación. Los lenguajes de script simples como Python tienen enlaces para ffmpeg: pypi.org/project/ffmpeg-python/#files
Mokubai
1
¿No puedes usar el filtro de fuente de película / película en -filter_complex_script?
Paul B. Mahol
@ PaulB.Mahol Eso es lo que finalmente terminé descubriendo un día después. (No había visto tu comentario antes, me temo.) Si lo pones en una respuesta correcta (con una mención sobre el escape de nombres de archivos), lo marcaré como respuesta. :-)
Stigma

Respuestas:

0

Un enfoque sería cambiar la limitación. Podría funcionar hasta cierto punto.

Esta respuesta dice:

POSIX denota este límite ARG_MAX y en los sistemas que cumplen con POSIX puede consultarlo

$ getconf ARG_MAX    # Get argument limit in bytes

P.ej. en Cygwin esto es 32000, y en los diferentes BSD y sistemas Linux que uso, está en cualquier lugar desde 131072 hasta 2621440.

El valor en Cygwin es relativamente bajo (sospecho que alguna de las limitaciones de Windows puede ser la causa), pero sigue siendo cuatro veces mayor que las 8000 que mencionó. No se el valor de ARG_MAX en el subsistema de Windows para Linux.

Un paso más sería correr ffmpeg en (posiblemente virtual) Linux.

Kamil Maciorowski
fuente