FFmpeg in Batch-FOR-Schleife für MP3-Dauer

FFmpeg in Batch-FOR-Schleife für MP3-Dauer

Ich habe eine Liste mit MP3s. Ich möchte auf dem Bildschirm und auch in einer Datei eine MP3 pro Zeile mit Angabe der Dauer sehen. Hier ist die Batchdatei, die ich verwende:

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

Dies bringt mehrere Probleme mit sich: Die Ausgabedatei enthält Dateinamen, aber keine Dauerangaben, und die Bildschirmanzeige enthält viel ffmpeg-Text und für jede Datei einen Fehler: „Es muss mindestens eine Ausgabedatei angegeben werden.“

Antwort1

ffmpegDie Konsolenausgabe dient nur zu Informationszwecken und sollte nicht mit Skripten analysiert werden. Verwenden Sie ffprobestattdessen:

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

Siehe auchFFprobe-DokumentationUndFFmpeg Wiki: FFprobe Tipps.

Antwort2

So erhalten Sie die Medieninformationen im folgenden Format:

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

Verwenden Sie den folgenden Code:

@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

Dadurch werden die Ergebnisse in der Datei output.txt protokolliert, die zur weiteren Verarbeitung in Tabellenkalkulationsprogrammen wie Excel geöffnet werden kann.

Antwort3

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
)

verwandte Informationen