From b1c0eca3289b85dd5dfe65d680b370001b6e8f90 Mon Sep 17 00:00:00 2001 From: Starfallen <36763490+Starfallan@users.noreply.github.com> Date: Thu, 19 Feb 2026 15:31:29 +0800 Subject: [PATCH] fix(player): clamp loudnorm parameters to valid FFmpeg ranges (#1838) - Define Integrated True Peak (TP) boundary constants. - Use .clamp() in Volume.format to ensure parameters stay within [-9, 0] for 'TP'. - Prevents FFmpeg filter errors when video metadata contains very low peak values (e.g., TP = -22). --- lib/models/video/play/url.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/models/video/play/url.dart b/lib/models/video/play/url.dart index b3f3ef5f6..74d6053a6 100644 --- a/lib/models/video/play/url.dart +++ b/lib/models/video/play/url.dart @@ -351,6 +351,10 @@ class Volume { // final MultiSceneArgs? multiSceneArgs; + // FFmpeg loudnorm 滤镜的标准有效范围(https://ffmpeg.org/ffmpeg-filters.html#loudnorm) + static const double minTpValue = -9.0; + static const double maxTpValue = 0.0; + factory Volume.fromJson(Map json) { return Volume( measuredI: json["measured_i"] ?? 0, @@ -367,7 +371,7 @@ class Volume { String format(Map config) { final lra = max(config['lra'] ?? 11, measuredLra); num i = config['i'] ?? targetI; - final tp = min(config['tp'] ?? targetTp, measuredTp); + final tp = min(config['tp'] ?? targetTp, measuredTp).clamp(minTpValue, maxTpValue); final offset = config['offset'] ?? targetOffset; num measuredI = this.measuredI; if (measuredI > 0) {