新增 video_quality 參數控制檔案大小; 修正 NVENC 位元率

- 原本 NVENC 只給 -cq 沒搭 -rc,位元率爆高(約112Mbps),成品比原檔還大
- 改為 -rc vbr -cq,cq 才真正生效;新增 video_quality 參數(預設 30)
- 實測 11 秒 4K 測試片由 161.7MB 降到 74.9MB(-54%)
- video_quality 同時套用到 NVENC -cq 與 x264 -crf;數字越大檔案越小
- 同步更新 README

本次調整由 Claude Opus 4.8 (1M context) 協助處理。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-02 21:36:26 +08:00
parent 05f5f67958
commit 44b52a4cf9
3 changed files with 13 additions and 4 deletions
+1
View File
@@ -96,6 +96,7 @@ python auto_remove_redlight.py 01.MOV 03.MOV 05.MOV
| `transition` | `true` | 剪接點是否加轉場(淡出淡入 + 恆定功率交叉淡化)。**開啟會強制重新編碼**,有 NVIDIA 顯卡時自動用 NVENC 加速 |
| `transition_duration` | `0.5` | 轉場長度(秒),畫面與聲音共用以維持同步 |
| `video_transition` | `fadeblack` | 畫面轉場類型:`fadeblack`=淡出到黑再淡入;`fade`=交叉溶接;其餘見 FFmpeg `xfade` 文件 |
| `video_quality` | `30` | 重新編碼畫質(NVENC `-rc vbr -cq`x264 `-crf`)。數字越大檔案越小、畫質越低。參考(4K 來源約 54Mbps):`28`≈高畫質(檔大)/`30`≈接近原檔/`33`≈省空間/`36`≈更小 |
| `volume_boost` | `true` | **音量增益**(Adobe PR「增益/音量」):是否放大音量 |
| `volume_boost_percent` | `30` | 音量增加幅度(%),`30` = 放大成 130%(×1.3 ≈ +2.3dB |
| `hard_limiter` | `true` | **強制壓限**Adobe PR「強制壓限/Hard Limiter」):拉大音量後把峰值壓在 0dB 以下,避免破音 |
+11 -4
View File
@@ -117,6 +117,10 @@ USE_GPU = True # EasyOCR 是否用 GPU。需 CUDA + GPU 版
# 設 True 時若沒有 CUDA,EasyOCR 會自動退回 CPU(不會壞)
REENCODE = False # False = 無損 -c copy(切點對齊關鍵幀,可能 ±1~2 秒)
# True = 重新編碼(切點精準到幀,但較慢、非無損)
VIDEO_QUALITY = 30 # 重新編碼(轉場/REENCODE)畫質。NVENC 用 -rc vbr -cq,
# 數字越大檔案越小、畫質越低。參考(4K 來源約 54Mbps):
# 28≈高畫質(~69Mbps,檔大) / 30≈接近原檔 / 33≈省空間(~37Mbps)
# / 36≈更小。同一數字也用作 x264 -crf(CPU 退回時)。
PROGRESS_EVERY = 60 # 進度回報: 每處理幾秒影片印一行目前時速 (秒)。
# 純顯示用,改小只是印多幾行,不影響速度與偵測精度
@@ -463,7 +467,7 @@ def ffmpeg_cut_concat(input_path: str, keeps: List[Tuple[float, float]],
"ffmpeg", "-y",
"-ss", f"{start:.3f}", "-i", input_path,
"-t", f"{dur:.3f}",
"-c:v", "libx264", "-preset", "medium", "-crf", "18",
"-c:v", "libx264", "-preset", "medium", "-crf", str(VIDEO_QUALITY),
"-c:a", "aac", "-b:a", "192k",
"-avoid_negative_ts", "make_zero",
seg,
@@ -619,11 +623,13 @@ def ffmpeg_cut_concat_xfade(input_path: str, keeps: List[Tuple[float, float]],
filtergraph = ";".join(parts)
# --- 編碼器: 有 GPU 用 NVENC,否則 libx264 ---
# --- 編碼器: 有 GPU 用 NVENC,否則 libx264;畫質由 VIDEO_QUALITY 控制 ---
# NVENC 必須搭配 -rc vbr,-cq 才會真正控制位元率/檔案大小(否則位元率會爆高)
if use_gpu:
venc = ["-c:v", "h264_nvenc", "-preset", "p5", "-cq", "19"]
venc = ["-c:v", "h264_nvenc", "-preset", "p5",
"-rc", "vbr", "-cq", str(VIDEO_QUALITY)]
else:
venc = ["-c:v", "libx264", "-preset", "medium", "-crf", "18"]
venc = ["-c:v", "libx264", "-preset", "medium", "-crf", str(VIDEO_QUALITY)]
cmd += ["-filter_complex", filtergraph, "-map", f"[{vlabel}]"]
if audio:
@@ -974,6 +980,7 @@ _CONFIG_KEYS = {
"transition": "TRANSITION",
"transition_duration": "TRANSITION_DURATION",
"video_transition": "VIDEO_TRANSITION",
"video_quality": "VIDEO_QUALITY",
"volume_boost": "VOLUME_BOOST",
"volume_boost_percent": "VOLUME_BOOST_PERCENT",
"hard_limiter": "HARD_LIMITER",
+1
View File
@@ -20,6 +20,7 @@
"transition": true,
"transition_duration": 0.5,
"video_transition": "fadeblack",
"video_quality": 30,
"volume_boost": true,
"volume_boost_percent": 30,
"hard_limiter": true,