本文将介绍如何使用FFmpeg+NVENC进行压片,首先要声明GPU压片的效果一定不如CPU压片的效果好,但GPU即使参数拉到最满,速度也比CPU压片快的多的多。所以你的CPU如果不是什么好U又不想浪费生命,请使用GPU编码。
首先是压片工具,FFmpeg即可,其他图形化工具都是使用预设参数调用这些而已,而且他们的预设参数并不一定高效,也不一定质量好。所以,请去FFmpeg下载一个压缩包,然后解压。
问题来了,这东西只能命令行,要如何使用呢。我给大家写好了通用脚本,请保存为.bat文件并与FFmpeg的bin文件(exe可执行文件)放在同一目录。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
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 ) |
脚本使用说明:
1、确保脚本所在目录下有一个名为 ffmpeg.exe 的可执行文件 。如果没有,可以修改脚本中的 FFMPEG_BIN 变量将其指向电脑上的绝对路径(例如 set "FFMPEG_BIN=C:\ffmpeg\bin\ffmpeg.exe")。
2、脚本使用了 -c:v hevc_nvenc 参数 ,电脑必须配备支持 NVENC(H.265/HEVC)硬件编码的N卡。
自定义配置:
TARGET_RESOLUTION: 视频导出分辨率。留空表示原画输出。如果需要转为 1080p,请填写 1920:1080;如果需要 720p,请填写 1280:720。
FONT_DIR: 指定加载外挂字幕时的本地字体库目录,防止字体缺失导致样式错误 。
V_BITRATE 等参数: 控制输出视频的码率,默认配置为平均 2000k、最大 4000k。可以根据画面复杂度和分辨率适当调高(例如 1080p 可以设置 4000k / 8000k)。
字幕自动挂载:
脚本具有“自动寻找同名外挂字幕并压制进视频(硬字幕)”的功能。
只要将字幕文件放在视频同目录下,并且文件名与视频一致(例如 video.mp4 和 video.ass),脚本会自动加载。优先级为:ASS > SSA > SRT 。如果没有找到匹配的字幕,它将直接跳过字幕加载。
运行方式:
此脚本不适合直接双击运行,因为它需要接收 输入文件 和 输出文件 两个参数 。您可以通过以下两种方式使用它:
方法 1:通过命令行运行 (CMD/PowerShell)
打开命令行工具,输入:
|
1 |
convert_lilith.bat "D:\视频\原视频.mp4" "D:\视频\输出结果.mp4" |
方法 2:结合批量处理脚本 (推荐)
如果你有很多文件需要压制,可以新建一个 run_all.bat 文件,利用 for 循环调用这个核心脚本:
|
1 2 3 4 5 6 7 |
@echo off :: 遍历当前目录下所有的 mp4 文件 for %%a in ("*.mp4") do ( :: 调用我们的脚本,输出文件加上 _encoded 后缀 call convert_lilith.bat "%%a" "%%~na_encoded.mp4" ) pause |
将 run_all.bat 与您的视频和 convert_lilith.bat 放在同一个文件夹下,双击 run_all.bat 即可实现批量压制。
至于压片参数,我就不解释了。所有参数基本上是GPU压片的最高预设,比如p7(NVENC 提供的最高质量预设)和10bit以及2-pass以及B帧。
需要注意的是,如果你的显卡是RTX 20系以前,可能无法使用B帧参考,如果你的显卡是40系以后,也可以自行使用-c:v av1_nvenc。
祝您压片愉快。