FFmpeg en lote FOR Loop para duración de MP3

FFmpeg en lote FOR Loop para duración de MP3

Tengo una lista de MP3. Me gustaría ver, en pantalla y también en un archivo, un MP3 por línea, con indicación de su duración. Aquí está el archivo por lotes que estoy usando:

@echo off

cls
if exist MP3Duration.txt del MP3Duration.txt

for %%i in (*.mp3) do (
  echo %%i
  echo %%i >> MP3Duration.txt
  ffmpeg -i "%%i" | find "Duration" >> MP3Duration.txt
)

Esto tiene varios problemas: el archivo de salida contiene nombres de archivo pero no duraciones, y la visualización en pantalla incluye una gran cantidad de texto ffmpeg y, para cada archivo, un error: "Se debe especificar al menos un archivo de salida".

Respuesta1

ffmpegLa salida de la consola tiene solo fines informativos y no debe analizarse con secuencias de comandos. Utilice ffprobeen su lugar:

ffprobe -loglevel error -select_streams a -show_entries stream=duration -sexagesimal -of default=noprint_wrappers=1:nokey=1 "%%i" | TEE.BAT -a MP3Duration.txt

Ver tambiénDocumentación de FFprobeyWiki FFmpeg: Consejos de FFprobe.

Respuesta2

Para obtener la información multimedia en el siguiente formato:

1.mp3|00:33:11
2.mp3|00:34:28
3.mp4|00:04:18
4.mp4|00:02:18

Utilice el siguiente código:

@echo off
>output.txt (
    for %%F in (*.mp3 *.mp4) do (
        for /f "tokens=2-5 delims=:., " %%a in (
            'ffmpeg -i "%%F" 2^>^&1 ^| find "Duration:"'
        ) do (
            set /p =%%~nxF^|<nul
            setlocal enableDelayedExpansion
            set /a "duration=1%%a*3600 + 1%%b*60 + 1%%c - 366100"
            REM echo !duration!.%%d seconds
            echo %%a:%%b:%%c
            endlocal
        )
    )
)
pause

Esto registrará los resultados en el archivo output.txt, que se puede abrir en programas de hoja de cálculo como Excel, para su posterior procesamiento.

Respuesta3

rem this assumes ffmpeg is in c:\ffmpeg


if exist filelist.txt ( del /F filelist.txt )
if exist list.txt ( del /F list.txt )
copy nul list.txt >nul

rem change exts as needed for your audio files

    if exist *.mkv ( dir/b *.mkv >>list.txt )   
    if exist *.fl? ( dir/b *.fl? >>list.txt )   
    if exist *.avi ( dir/b *.avi >>list.txt )   
    if exist *.mp4 ( dir/b *.mp4 >>list.txt )   
    if exist *.mov ( dir/b *.mov >>list.txt )   
    if exist *.swf ( dir/b *.swf >>list.txt )

sort <list.txt >filelist.txt   


for /F "delims=;" %%F in ( filelist.txt ) do (
        for %%F in (^"%%F^") do (
            for /f "tokens=2-5 delims=:., " %%a in (
                'c:\ffmpeg\ffmpeg -i "%%F" 2^>^&1 ^| find "Duration:"'
            ) do (
                set /a full=%%a * 60 * 60 + %%b * 60 + %%c
            )
        )
        echo Length of %%F is %%a:%%b:%%c or !full! Seconds
)

información relacionada