Windows: directorios recurrentes por lotes para duraciones de archivos multimedia utilizando FFmpeg

Windows: directorios recurrentes por lotes para duraciones de archivos multimedia utilizando FFmpeg

Tengo varios tipos de archivos multimedia (por ejemplo, .wav, .mp4) en varias carpetas. Me gustaría utilizar un archivo por lotes para generar una lista de sus duraciones, como esta:

D:\Some Folder 1\Movie File.mp4 | 2:15:23
E:\Some Folder 2\Audio File.mp3 | 0:08:17

Volvería a ejecutar manualmente el archivo por lotes en unidades separadas si fuera necesario. Lo ideal sería que el listado incluyera algo como | símbolo, que sé que no sería parte del nombre de archivo de Windows, para facilitar la separación de la ruta del archivo y el nombre de la duración al analizar la lista en Excel.

Tengo un comando MediaInfo que proporciona una lista de tipos de archivos específicos dentro de una sola carpeta, como este:

mediainfo --output=General;%FileName%.%FileExtension%^|%Duration/String3%\r\n *.mp3 *.wav

Mis problemas con eso son (1) el conjunto de posibles tipos de archivos en una carpeta es abierto; No puedo estar seguro de que .mp3 y .wav (en ese ejemplo) los capturen todos; (2) No encuentro documentación detallada de MediaInfo, para satisfacer esta necesidad actual y estar seguro de poder modificar el comando para necesidades futuras (ver, por ejemplo,Kalishian); (3) No soy un asistente de recursividad por lotes, es decir, a pesar de probar múltiples métodos para envolver ese comando en un bucle for, como se describe en1 2Discusiones de StackExchange, así comoun viejo foro de Doom9Al recomendarlo usebackq, no consigo que funcione en varias carpetas; y (4) Lo ideal sería aprender a hacer esto en ffmpeg/ffprobe de todos modos, como parte de un esfuerzo a largo plazo para aprender esas herramientas.

En ffprobe, encontré que esto funcionaba para archivos individuales:

ffprobe -i "input.mp4" -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal

como alternativa a un modelo menos elegante pero quizás más adaptablearchivo por lotes- aunque no estaba claro cómo obtener el nombre del archivo y la duración en la misma línea de salida. Pero, al igual que con MediaInfo, no he podido ampliar esto a varios archivos (por ejemplo, reemplazando "input.mp4" con "*.*") o hacerlo recursivo, usando los métodos citados anteriormente. Por ejemplo, probé esta adaptación deLa sugerencia de Jack Allan:

for /R %f in (*.*) do ffprobe -i *.* -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal

pero eso no produjo ninguna información de archivo.

Mi pregunta:¿Cómo puedo usar ffmpeg/ffprobe en un archivo por lotes para producir una lista de archivos multimedia, con rutas y duraciones completas, extraídas de forma recursiva de varias carpetas?

Respuesta1

Pruebe esto desde un archivo por lotes:

for /R %%i in (*) do ffprobe -i "%%~fi" -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal

Pruebe esto desde el símbolo del sistema:

for /R %i in (*) do ffprobe -i "%~fi" -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal

Respuesta2

La misma necesidad aquí. Estaba muy interesado en una respuesta ya que estaba luchando y después de algunos intentos, aquí hay una solución poco elegante pero funcionó para mí.

para /R %f en (*) hacer (echo "%~ff" >>"filename.txt" & ffprobe -i "%~ff" -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal >>"nombre de archivo.txt")

información relacionada