chcp 936
@echo off
setlocal enabledelayedexpansion
:: ==========================================
:: [用户配置区域] - 请填写正常的 Windows 路径
:: ==========================================
:: 1. [分辨率] 目标分辨率,例如 1920:1080 (留空则保持原分辨率)
set "TARGET_RESOLUTION="
:: 2. [字体] 字体文件夹 (直接填 C:\...)
set "FONT_DIR=D:\Other\fonts"
:: 3. [编码参数]
set V_BITRATE=2000k
set V_MAXRATE=4000k
set V_BUFSIZE=4000k
set A_BITRATE=96k
:: 4. [音轨/字幕索引]
set AUDIO_INDEX=0
set SUB_INDEX=0
:: 5. [备用字体名]
set "SRT_FONT_NAME=Microsoft YaHei"
:: 6. [FFmpeg路径] (使用 %~dp0 指向同级目录)
set "FFMPEG_BIN=%~dp0ffmpeg.exe"
:: ==========================================
:: [系统处理区域] - 自动处理转义,请勿修改
:: ==========================================
set "INPUT_FILE=%~1"
set "OUTPUT_FILE=%~2"
:: 路径检查
if not exist "!INPUT_FILE!" (
echo [ERROR] 输入文件不存在: !INPUT_FILE!
exit /b 1
)
:: --- 核心修复:自动生成 FFmpeg 专用转义路径 ---
:: 原理:先将 \ 替换为 /,再将 : 替换为 \:
set "FONT_DIR_ESC=!FONT_DIR:\=/!"
set "FONT_DIR_ESC=!FONT_DIR_ESC::=\:!"
:: 获取文件名信息
set "DIR_PATH=%~dp1"
set "FILENAME_NO_EXT=%~n1"
set "DIR_PATH_ESC=!DIR_PATH:\=/!"
set "DIR_PATH_ESC=!DIR_PATH_ESC::=\:!"
:: ==========================================
:: [逻辑判断]
:: ==========================================
echo [INFO] 正在处理: !FILENAME_NO_EXT!
:: 初始化内容字幕变量为空
set "CONTENT_SUB="
:: 1. 使用通配符查找 ASS 字幕 (支持 .scjp.ass 这种带后缀的情况)
set "FOUND_ASS="
for %%i in ("!DIR_PATH!!FILENAME_NO_EXT!*.ass") do (
set "FOUND_ASS=%%~nxi"
)
:: 2. 使用通配符查找 SRT 字幕
set "FOUND_SRT="
for %%i in ("!DIR_PATH!!FILENAME_NO_EXT!*.srt") do (
set "FOUND_SRT=%%~nxi"
)
:: 检查外挂字幕 (优先级最高)
if defined FOUND_ASS (
echo [字幕] 挂载外挂 ASS: !FOUND_ASS!
set "CONTENT_SUB=subtitles='!DIR_PATH_ESC!!FOUND_ASS!':fontsdir='!FONT_DIR_ESC!'"
) else if exist "!DIR_PATH!!FILENAME_NO_EXT!.ssa" (
echo [字幕] 挂载外挂 SSA
set "CONTENT_SUB=subtitles='!DIR_PATH_ESC!!FILENAME_NO_EXT!.ssa':fontsdir='!FONT_DIR_ESC!'"
) else if defined FOUND_SRT (
echo [字幕] 挂载外挂 SRT [强制雅黑]: !FOUND_SRT!
set "CONTENT_SUB=subtitles='!DIR_PATH_ESC!!FOUND_SRT!':fontsdir='!FONT_DIR_ESC!':force_style='FontName=!SRT_FONT_NAME!'"
) else (
echo [字幕] 未发现外挂字幕。跳过外挂加载。
set "CONTENT_SUB="
)
:: 构建滤镜链 (智能处理逗号)
set "FILTER_CHAIN="
:: 优先处理分辨率缩放
if defined TARGET_RESOLUTION (
echo [视频] 缩放分辨率至: !TARGET_RESOLUTION!
set "FILTER_CHAIN=scale=!TARGET_RESOLUTION!"
)
:: 拼接字幕滤镜
if defined CONTENT_SUB (
if defined FILTER_CHAIN (
set "FILTER_CHAIN=!FILTER_CHAIN!,!CONTENT_SUB!"
) else (
set "FILTER_CHAIN=!CONTENT_SUB!"
)
)
:: ==========================================
:: [开始转换]
:: ==========================================
:: 如果 FILTER_CHAIN 是空的,就不加 -vf 参数
if defined FILTER_CHAIN (
set "VF_PARAM=-vf "!FILTER_CHAIN!""
) else (
set "VF_PARAM="
)
"!FFMPEG_BIN!" -y -v error -stats ^
-i "!INPUT_FILE!" ^
-map 0:v:0 ^
-map 0:a:!AUDIO_INDEX! ^
-c:v hevc_nvenc ^
-pix_fmt p010le ^
-preset p7 ^
-rc vbr_hq ^
-multipass 2 ^
-b:v %V_BITRATE% -maxrate %V_MAXRATE% -bufsize %V_BUFSIZE% ^
-bf 4 -b_ref_mode middle ^
-rc-lookahead 32 ^
-spatial_aq 1 -temporal_aq 1 ^
-c:a aac -b:a %A_BITRATE% ^
!VF_PARAM! ^
"!OUTPUT_FILE!"
if !errorlevel! neq 0 (
echo [FAIL] 转换失败,错误码: !errorlevel!
exit /b 1
) else (
echo [OK] 成功.
exit /b 0
)