>>30108768@echo off
chcp 65001 >nul
setlocal EnableDelayedExpansion
:: ==========================================
:: GLOBAL SETTINGS
:: ==========================================
set "inputDir=%~dp0Video"
set "outputDir=%~dp0webm"
:: 建立資料夾
if not exist "%inputDir%" mkdir "%inputDir%"
if not exist "%outputDir%" mkdir "%outputDir%"
:: ==========================================
:: USER INTERFACE
:: ==========================================
cls
echo ==========================================
echo Video 5MB 壓縮工具 (穩定修正版)
echo ==========================================
echo.
echo [1] 速度優先 (CPU 4)
echo [2] 平衡模式 (CPU 2)
echo [3] 高品質模式 (CPU 1)
echo [4] 極致模式 (CPU 0)
echo.
set /p "modeChoice=請選擇畫質模式 (1-4): "
:: 設定 CPU 效率等級
if "%modeChoice%"=="1" (set "cpuEffort=4") else if "%modeChoice%"=="2" (set "cpuEffort=2") else if "%modeChoice%"=="3" (set "cpuEffort=1") else if "%modeChoice%"=="4" (set "cpuEffort=0") else (set "cpuEffort=2")
echo.
set /p "width=請輸入最大寬度 (例如 854,直接 Enter 則不縮放): "
set "scaleFilter="
if not "%width%"=="" set "scaleFilter=-vf scale=%width%:-2"
:: ==========================================
:: PROCESS FILES
:: ==========================================
for %%i in ("%inputDir%\*.*") do (
set "inputFile=%%i"
set "fileName=%%~ni"
set "outputFile=%outputDir%\!fileName!.webm"
echo.
echo ------------------------------------------
echo 正在讀取影片資訊: !fileName!
:: 獲取時長 (使用 ffprobe)
for /f "tokens=*" %%a in ('ffprobe -v error -select_streams v:0 -show_entries format^=duration -of default^=noprint_wrappers^=1:nokey^=1 "%%i"') do set "duration=%%a"
:: 檢查時長是否成功獲取
if "!duration!"=="" (
echo [錯誤] 無法讀取影片時長,跳過此檔案。
goto :next_file
)
:: 使用 PowerShell 精確計算位元率,避免 Batch 的整數計算錯誤與溢位
for /f "tokens=*" %%b in ('powershell -Command "$bitrate = [math]::Floor(((5000 * 8 * 1024) - (32 * !duration! * 1024)) / !duration! / 1024); if ($bitrate -lt 100) { 100 } else { $bitrate }"') do set "vBitrate=%%b"
echo 模式: %modeChoice% ^| 計算位元率: !vBitrate! kbps
:: VP9 參數
set "vp9_base=-c:v libvpx-vp9 -deadline good -cpu-used %cpuEffort% -row-mt 1 -pix_fmt yuv420p -b:v !vBitrate!k"
:: 執行編碼
echo [Step 1/2] 正在分析影片...
ffmpeg -i "%%i" !vp9_base! -pass 1 -an -f webm -y NUL 2>nul
echo [Step 2/2] 正在輸出高品質 WebM...
ffmpeg -i "%%i" !vp9_base! -pass 2 %scaleFilter% -c:a libopus -b:a 32k -ac 2 -y "!outputFile!"
:next_file
:: 清除 pass log
if exist "ffmpeg2pass-0.log" del /q "ffmpeg2pass-0.log"
)
echo.
echo ==========================================
echo 所有任務已完成!
pause