>>30221608@echo off
setlocal enabledelayedexpansion
echo ========================================================
echo Video Compressor (Target: Under 5120 KB / 5 MB)
echo ========================================================
if "%~1"=="" (
echo [ERROR] No input file provided.
echo Please drag and drop a video file onto this script.
pause
exit /b
)
set "INPUT=%~1"
set "OUTPUT=%~dpn1_5MB.mp4"
rem Target slightly under 5120 KB (e.g. 4900 KB) to account for container overhead
set "TARGET_SIZE_KB=4900"
echo Input file: %INPUT%
echo Output file: %OUTPUT%
echo.
rem Get duration using ffprobe
for /f "delims=" %%a in ('ffprobe -v error -show_entries format^=duration -of default^=noprint_wrappers^=1:nokey^=1 "%~1"') do set "DURATION=%%a"
if "!DURATION!"=="" (
echo [ERROR] Failed to get video duration.
echo Please ensure FFmpeg is installed and added to your system PATH.
pause
exit /b
)
rem Round the duration (batch cannot handle floats directly)
for /f "tokens=1 delims=." %%a in ("!DURATION!") do set "DUR=%%a"
if !DUR! LEQ 0 (
echo [ERROR] Invalid video duration (!DUR! seconds^).
pause
exit /b
)
rem Calculate Target Total Bitrate (in kbps)
rem Formula: (Target Size in KB * 8) / Duration in seconds
set /a "TOTAL_BITRATE=(!TARGET_SIZE_KB! * 8) / !DUR!"
rem Set Audio Bitrate (kbps)
set "AUDIO_BITRATE=64"
rem Calculate Video Bitrate (kbps)
set /a "VIDEO_BITRATE=!TOTAL_BITRATE! - !AUDIO_BITRATE!"
if !VIDEO_BITRATE! LSS 10 (
echo [ERROR] Video is too long to fit into 5MB with reasonable quality.
echo Calculated video bitrate is too low ^(!VIDEO_BITRATE! kbps^).
pause
exit /b
)
echo Video Duration: !DUR! seconds
echo Target Total Bitrate: !TOTAL_BITRATE! kbps
echo Target Video Bitrate: !VIDEO_BITRATE! kbps
echo Target Audio Bitrate: !AUDIO_BITRATE! kbps
echo.
echo Starting 2-pass encoding...
echo.
rem Pass 1
echo [1/2] Running Pass 1...
ffmpeg -y -i "%INPUT%" -c:v libx264 -b:v !VIDEO_BITRATE!k -pass 1 -an -f null NUL
if errorlevel 1 (
echo [ERROR] Pass 1 failed.
pause
exit /b
)
rem Pass 2
echo.
echo [2/2] Running Pass 2...
ffmpeg -y -i "%INPUT%" -c:v libx264 -b:v !VIDEO_BITRATE!k -pass 2 -c:a aac -b:a !AUDIO_BITRATE!k "%OUTPUT%"
if errorlevel 1 (
echo [ERROR] Pass 2 failed.
pause
exit /b
)
rem Clean up log files
if exist "ffmpeg2pass-0.log" del "ffmpeg2pass-0.log"
if exist "ffmpeg2pass-0.log.mbtree" del "ffmpeg2pass-0.log.mbtree"
echo.
echo ========================================================
echo Compression Complete!
echo Saved to: %OUTPUT%
echo ========================================================
pause