From 44b52a4cf9324145f788707518ea5066033a746b Mon Sep 17 00:00:00 2001 From: JianMiau Date: Tue, 2 Jun 2026 21:36:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20video=5Fquality=20?= =?UTF-8?q?=E5=8F=83=E6=95=B8=E6=8E=A7=E5=88=B6=E6=AA=94=E6=A1=88=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F;=20=E4=BF=AE=E6=AD=A3=20NVENC=20=E4=BD=8D=E5=85=83?= =?UTF-8?q?=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 原本 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) --- README.md | 1 + auto_remove_redlight.py | 15 +++++++++++---- config.json | 1 + 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index fdad65d..571ac58 100644 --- a/README.md +++ b/README.md @@ -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 以下,避免破音 | diff --git a/auto_remove_redlight.py b/auto_remove_redlight.py index 1a44e31..4378a6f 100644 --- a/auto_remove_redlight.py +++ b/auto_remove_redlight.py @@ -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", diff --git a/config.json b/config.json index 0e67464..9dff581 100644 --- a/config.json +++ b/config.json @@ -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,