From 995d6339431cb0438c7bf5ac30caa4dcce1b4d71 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Thu, 10 Aug 2023 20:06:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=AF=BB=E5=8F=96=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E7=94=BB=E8=B4=A8=E9=9F=B3=E8=B4=A8=E7=BC=96=E7=A0=81=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/video/detail/controller.dart | 66 +++++++++++++++++++++----- 1 file changed, 54 insertions(+), 12 deletions(-) diff --git a/lib/pages/video/detail/controller.dart b/lib/pages/video/detail/controller.dart index 9af63aa8..d4cda6b2 100644 --- a/lib/pages/video/detail/controller.dart +++ b/lib/pages/video/detail/controller.dart @@ -28,6 +28,8 @@ class VideoDetailController extends GetxController SearchType videoType = SearchType.video; late PlayUrlModel data; + + Box setting = GStrorage.setting; // 当前画质 late VideoQuality currentVideoQa; // 当前音质 @@ -167,26 +169,66 @@ class VideoDetailController extends GetxController data = result['data']; /// 优先顺序 省流模式 -> 设置中指定质量 -> 当前可选的最高质量 - VideoItem firstVideo = data.dash!.video!.first; - // String videoUrl = firstVideo.baseUrl!; - // - currentVideoQa = VideoQualityCode.fromCode(firstVideo.id!)!; + List allVideosList = data.dash!.video!; + late VideoItem firstVideo; + + try { + // 当前可播放的最高质量视频 + int currentHighVideoQa = allVideosList.first.quality!.code; + // + int cacheVideoQa = setting.get(SettingBoxKey.defaultVideoQa, + defaultValue: currentHighVideoQa); + int resVideoQa = currentHighVideoQa; + if (cacheVideoQa <= currentHighVideoQa) { + // 如果默认设置的画质比当前可用的低,使用默认值 + resVideoQa = cacheVideoQa; + } + currentVideoQa = VideoQualityCode.fromCode(resVideoQa)!; + + /// 取出符合当前画质的videoList + List videosList = + allVideosList.where((e) => e.quality!.code == resVideoQa).toList(); + + /// 优先顺序 设置中指定解码格式 -> 当前可选的首个解码格式 + List supportFormats = data.supportFormats!; + // 根据画质选编码格式 + List supportDecodeFormats = + supportFormats.firstWhere((e) => e.quality == resVideoQa).codecs!; + + try { + currentDecodeFormats = VideoDecodeFormatsCode.fromString(setting.get( + SettingBoxKey.defaultDecode, + defaultValue: supportDecodeFormats.first))!; + } catch (_) {} + + /// 取出符合当前解码格式的videoItem + firstVideo = videosList + .firstWhere((e) => e.codecs!.startsWith(currentDecodeFormats.code)); + } catch (_) {} /// 优先顺序 设置中指定质量 -> 当前可选的最高质量 - AudioItem firstAudio = - data.dash!.audio!.isNotEmpty ? data.dash!.audio!.first : AudioItem(); + late AudioItem firstAudio; + try { + if (data.dash!.audio!.isNotEmpty) { + firstAudio = data.dash!.audio!.first; + int resultAudioQa = setting.get(SettingBoxKey.defaultAudioQa, + defaultValue: data.dash!.audio!.first.id); + // 选择最接近的那个音轨 + try { + firstAudio = + data.dash!.audio!.firstWhere((e) => e.id == resultAudioQa); + } catch (_) {} + } else { + firstAudio = AudioItem(); + } + } catch (_) {} + String audioUrl = firstAudio.baseUrl ?? ''; // if (firstAudio.id != null) { currentAudioQa = AudioQualityCode.fromCode(firstAudio.id!)!; } - /// 优先顺序 设置中指定解码格式 -> 当前可选的首个解码格式 - List supportFormats = data.supportFormats!; - List supportDecodeFormats = supportFormats.first.codecs!; - currentDecodeFormats = - VideoDecodeFormatsCode.fromString(supportDecodeFormats.first)!; - await playerInit( firstVideo, audioUrl,