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
ffmpeg
Die Konsolenausgabe dient nur zu Informationszwecken und sollte nicht mit Skripten analysiert werden. Verwenden Sie ffprobe
stattdessen:
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
)