MP3 목록이 있어요. 화면과 파일에서 재생 시간 표시와 함께 한 줄에 하나의 MP3를 보고 싶습니다. 내가 사용하는 배치 파일은 다음과 같습니다.
@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
)
여기에는 몇 가지 문제가 있습니다. 출력 파일에는 파일 이름이 포함되어 있지만 기간은 없고 화면 표시에는 많은 ffmpeg 텍스트가 포함되어 있으며 각 파일에 대해 "최소 하나의 출력 파일을 지정해야 합니다."라는 오류가 표시됩니다.
답변1
ffmpeg
콘솔 출력은 정보 제공 목적으로만 사용되며 스크립팅으로 구문 분석하면 안 됩니다. 대신 사용하세요 ffprobe
:
ffprobe -loglevel error -select_streams a -show_entries stream=duration -sexagesimal -of default=noprint_wrappers=1:nokey=1 "%%i" | TEE.BAT -a MP3Duration.txt
또한 참조하십시오FF프로브 문서그리고FFmpeg Wiki: FFprobe 팁.
답변2
다음 형식으로 미디어 정보를 얻으려면:
1.mp3|00:33:11
2.mp3|00:34:28
3.mp4|00:04:18
4.mp4|00:02:18
다음 코드를 사용하십시오.
@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
그러면 추가 처리를 위해 Excel과 같은 스프레드시트 프로그램에서 열 수 있는 output.txt 파일에 결과가 기록됩니다.
답변3
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
)