diff --git a/lib/models/video/play/url.dart b/lib/models/video/play/url.dart index fc078f7f1..65e6590fd 100644 --- a/lib/models/video/play/url.dart +++ b/lib/models/video/play/url.dart @@ -1,3 +1,5 @@ +import 'dart:math' show max, min; + import 'package:PiliPlus/models/common/video/audio_quality.dart'; import 'package:PiliPlus/models/common/video/video_quality.dart'; import 'package:PiliPlus/utils/extension.dart'; @@ -341,9 +343,18 @@ class Volume { ); } - @override - String toString() => - 'measured_I=$measuredI:measured_LRA=$measuredLra:measured_TP=$measuredTp:measured_thresh=$measuredThreshold'; + String format(Map config) { + final lra = max(config['lra'] ?? 11, measuredLra); + num i = config['i'] ?? targetI; + final tp = min(config['tp'] ?? targetTp, measuredTp); + final offset = config['offset'] ?? targetOffset; + num measuredI = this.measuredI; + if (measuredI > 0) { + i -= measuredI; + measuredI = 0; + } + return 'LRA=$lra:I=$i:TP=$tp:offset=$offset:linear=true:measured_I=$measuredI:measured_LRA=$measuredLra:measured_TP=$measuredTp:measured_thresh=$measuredThreshold'; + } bool get isNotEmpty => measuredI != 0 || diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 9fd71220f..2d60730b2 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -747,7 +747,7 @@ class PlPlayerController { } } - static final loudnormRegExp = RegExp('loudnorm=[^,]+'); + static final loudnormRegExp = RegExp('loudnorm=([^,]+)'); // 配置播放器 Future _createVideoController( @@ -845,7 +845,15 @@ class PlPlayerController { if (volume != null && volume.isNotEmpty) { audioNormalization = audioNormalization.replaceFirstMapped( loudnormRegExp, - (i) => '${i[0]}:$volume', + (i) => + 'loudnorm=${volume.format( + Map.fromEntries( + i.group(1)!.split(':').map((item) { + final parts = item.split('='); + return MapEntry(parts[0].toLowerCase(), num.parse(parts[1])); + }), + ), + )}', ); } else { audioNormalization = audioNormalization.replaceFirst(