本文將介紹如何使用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。
祝您壓片愉快。