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,