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
ffmpeg
La salida de la consola tiene solo fines informativos y no debe analizarse con secuencias de comandos. Utilice ffprobe
en 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
)