From d285f000862d69c04c390aa62396e8d266e25a01 Mon Sep 17 00:00:00 2001 From: Kofua <1638183271zjn@gmail.com> Date: Sun, 7 Sep 2025 11:35:12 +0800 Subject: [PATCH] fix dolby videos playing (#1202) --- .../common/video/video_decode_type.dart | 16 +++++------ lib/pages/setting/models/video_settings.dart | 4 +-- lib/pages/video/controller.dart | 27 ++++++++++++------- lib/pages/video/widgets/header_control.dart | 8 ++++-- lib/utils/storage_pref.dart | 4 +-- 5 files changed, 36 insertions(+), 23 deletions(-) diff --git a/lib/models/common/video/video_decode_type.dart b/lib/models/common/video/video_decode_type.dart index 4825c90c..fa8f1509 100644 --- a/lib/models/common/video/video_decode_type.dart +++ b/lib/models/common/video/video_decode_type.dart @@ -1,19 +1,19 @@ // ignore_for_file: constant_identifier_names enum VideoDecodeFormatType { - DVH1('dvh1'), - AV1('av01'), - HEVC('hev1'), - AVC('avc1'); + DVH1(['dvh1']), + AV1(['av01']), + HEVC(['hev1', 'hvc1']), + AVC(['avc1']); String get description => name; - final String code; + final List codes; - const VideoDecodeFormatType(this.code); + const VideoDecodeFormatType(this.codes); static VideoDecodeFormatType fromCode(String code) => - values.firstWhere((i) => i.code == code); + values.firstWhere((i) => i.codes.contains(code)); static VideoDecodeFormatType fromString(String val) => - values.firstWhere((i) => val.startsWith(i.code)); + values.firstWhere((i) => i.codes.any(val.startsWith)); } diff --git a/lib/pages/setting/models/video_settings.dart b/lib/pages/setting/models/video_settings.dart index d52f1382..a32a08e9 100644 --- a/lib/pages/setting/models/video_settings.dart +++ b/lib/pages/setting/models/video_settings.dart @@ -251,7 +251,7 @@ List get videoSettings => [ title: '默认解码格式', value: Pref.defaultDecode, values: VideoDecodeFormatType.values - .map((e) => (e.code, e.description)) + .map((e) => (e.codes.first, e.description)) .toList(), ); }, @@ -276,7 +276,7 @@ List get videoSettings => [ title: '次选解码格式', value: Pref.secondDecode, values: VideoDecodeFormatType.values - .map((e) => (e.code, e.description)) + .map((e) => (e.codes.first, e.description)) .toList(), ); }, diff --git a/lib/pages/video/controller.dart b/lib/pages/video/controller.dart index 66f0060a..ebda3553 100644 --- a/lib/pages/video/controller.dart +++ b/lib/pages/video/controller.dart @@ -99,6 +99,7 @@ class VideoDetailController extends GetxController late Rx currentVideoQa; AudioQuality? currentAudioQa; late VideoDecodeFormatType currentDecodeFormats; + // 是否开始自动播放 存在多p的情况下,第二p需要为true final RxBool autoPlay = true.obs; @@ -114,6 +115,7 @@ class VideoDetailController extends GetxController String? audioUrl; Duration? defaultST; Duration? playedTime; + // 亮度 double? brightness; @@ -142,6 +144,7 @@ class VideoDetailController extends GetxController late bool isExpanding = false; late bool isCollapsing = false; AnimationController? _animationController; + AnimationController get animationController => _animationController ??= AnimationController( vsync: this, @@ -421,7 +424,9 @@ class VideoDetailController extends GetxController } bool isPortrait = true; + bool get horizontalScreen => plPlayerController.horizontalScreen; + bool get showVideoSheet => !horizontalScreen && !isPortrait; int? _lastPos; @@ -429,9 +434,11 @@ class VideoDetailController extends GetxController RxList segmentList = [].obs; List viewPointList = []; List? segmentProgressList; + Color _getColor(SegmentType segment) => plPlayerController.blockColor[segment.index]; late RxString videoLabel = ''.obs; + String get blockServer => plPlayerController.blockServer; Timer? skipTimer; @@ -993,23 +1000,23 @@ class VideoDetailController extends GetxController /// 根据currentVideoQa和currentDecodeFormats 重新设置videoUrl final videoList = data.dash!.video!.where((i) => i.id == qa).toList(); - final currentDecodeFormats = this.currentDecodeFormats.code; + final currentDecodeFormats = this.currentDecodeFormats.codes; final defaultDecodeFormats = VideoDecodeFormatType.fromString( cacheDecode, - ).code; + ).codes; final secondDecodeFormats = VideoDecodeFormatType.fromString( cacheSecondDecode, - ).code; + ).codes; VideoItem? video; for (var i in videoList) { final codec = i.codecs!; - if (codec.startsWith(currentDecodeFormats)) { + if (currentDecodeFormats.any(codec.startsWith)) { video = i; break; - } else if (codec.startsWith(defaultDecodeFormats)) { + } else if (defaultDecodeFormats.any(codec.startsWith)) { video = i; - } else if (video == null && codec.startsWith(secondDecodeFormats)) { + } else if (video == null && secondDecodeFormats.any(codec.startsWith)) { video = i; } } @@ -1108,6 +1115,7 @@ class VideoDetailController extends GetxController } bool isQuerying = false; + // 视频链接 Future queryVideoUrl({ Duration? defaultST, @@ -1226,10 +1234,10 @@ class VideoDetailController extends GetxController // 当前视频没有对应格式返回第一个 int flag = 0; for (var i in supportDecodeFormats) { - if (i.startsWith(currentDecodeFormats.code)) { + if (currentDecodeFormats.codes.any(i.startsWith)) { flag = 1; break; - } else if (i.startsWith(secondDecodeFormats.code)) { + } else if (secondDecodeFormats.codes.any(i.startsWith)) { flag = 2; } } @@ -1243,7 +1251,7 @@ class VideoDetailController extends GetxController /// 取出符合当前解码格式的videoItem firstVideo = videosList.firstWhere( - (e) => e.codecs!.startsWith(currentDecodeFormats.code), + (e) => currentDecodeFormats.codes.any(e.codecs!.startsWith), orElse: () => videosList.first, ); setVideoHeight(); @@ -1405,6 +1413,7 @@ class VideoDetailController extends GetxController int? graphVersion; EdgeInfoData? steinEdgeInfo; late final RxBool showSteinEdgeInfo = false.obs; + Future getSteinEdgeInfo([int? edgeId]) async { steinEdgeInfo = null; try { diff --git a/lib/pages/video/widgets/header_control.dart b/lib/pages/video/widgets/header_control.dart index ac223653..7063d1e2 100644 --- a/lib/pages/video/widgets/header_control.dart +++ b/lib/pages/video/widgets/header_control.dart @@ -55,6 +55,7 @@ class HeaderControl extends StatefulWidget { required this.heroTag, super.key, }); + final bool isPortrait; final PlPlayerController controller; final VideoDetailController videoDetailCtr; @@ -70,6 +71,7 @@ class HeaderControlState extends TripleState { late final PlayUrlModel videoInfo = videoDetailCtr.data; static const TextStyle subTitleStyle = TextStyle(fontSize: 12); static const TextStyle titleStyle = TextStyle(fontSize: 14); + String get heroTag => widget.heroTag; late final UgcIntroController ugcIntroController; late final PgcIntroController pgcIntroController; @@ -77,10 +79,12 @@ class HeaderControlState extends TripleState { late CommonIntroController introController = videoDetailCtr.isUgc ? ugcIntroController : pgcIntroController; + bool get isPortrait => widget.isPortrait; late final horizontalScreen = videoDetailCtr.horizontalScreen; RxString now = ''.obs; Timer? clock; + bool get isFullScreen => plPlayerController.isFullScreen.value; Box setting = GStorage.setting; late final provider = ContextSingleTicker(context); @@ -828,7 +832,7 @@ class HeaderControlState extends TripleState { ListTile( dense: true, onTap: () { - if (i.startsWith(currentDecodeFormats.code)) { + if (currentDecodeFormats.codes.any(i.startsWith)) { return; } videoDetailCtr @@ -848,7 +852,7 @@ class HeaderControlState extends TripleState { i, style: subTitleStyle, ), - trailing: i.startsWith(currentDecodeFormats.code) + trailing: currentDecodeFormats.codes.any(i.startsWith) ? Icon( Icons.done, color: theme.colorScheme.primary, diff --git a/lib/utils/storage_pref.dart b/lib/utils/storage_pref.dart index 2d4146d7..70b60f2a 100644 --- a/lib/utils/storage_pref.dart +++ b/lib/utils/storage_pref.dart @@ -218,12 +218,12 @@ abstract class Pref { static String get defaultDecode => _setting.get( SettingBoxKey.defaultDecode, - defaultValue: VideoDecodeFormatType.values.last.code, + defaultValue: VideoDecodeFormatType.values.last.codes.first, ); static String get secondDecode => _setting.get( SettingBoxKey.secondDecode, - defaultValue: VideoDecodeFormatType.AV1.code, + defaultValue: VideoDecodeFormatType.AV1.codes.first, ); static String get hardwareDecoding => _setting.get(