
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")