新增 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
+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",