diff --git a/lib/pages/video/detail/controller.dart b/lib/pages/video/detail/controller.dart index e4fd89dc..8fd71b32 100644 --- a/lib/pages/video/detail/controller.dart +++ b/lib/pages/video/detail/controller.dart @@ -209,27 +209,17 @@ class VideoDetailController extends GetxController if (result['status']) { data = result['data']; - /// 优先顺序 省流模式 -> 设置中指定质量 -> 当前可选的最高质量 - // firstVideo = data.dash!.video!.first; - // videoUrl = firstVideo.baseUrl!; - // // - // currentVideoQa = VideoQualityCode.fromCode(firstVideo.id!)!; - - // /// 优先顺序 设置中指定质量 -> 当前可选的最高质量 - // AudioItem firstAudio = - // data.dash!.audio!.isNotEmpty ? data.dash!.audio!.first : AudioItem(); - // audioUrl = firstAudio.baseUrl ?? ''; - List allVideosList = data.dash!.video!; try { // 当前可播放的最高质量视频 int currentHighVideoQa = allVideosList.first.quality!.code; - // + // 使用预设的画质 | 当前可用的最高质量 int cacheVideoQa = setting.get(SettingBoxKey.defaultVideoQa, defaultValue: currentHighVideoQa); int resVideoQa = currentHighVideoQa; if (cacheVideoQa <= currentHighVideoQa) { + // 如果预设的画质低于当前最高 List numbers = data.acceptQuality! .where((e) => e <= currentHighVideoQa) .toList(); @@ -250,10 +240,16 @@ class VideoDetailController extends GetxController currentDecodeFormats = VideoDecodeFormatsCode.fromString(setting.get( SettingBoxKey.defaultDecode, defaultValue: VideoDecodeFormats.values.last.code))!; + print(currentDecodeFormats.description); try { // 当前视频没有对应格式返回第一个 - currentDecodeFormats = supportDecodeFormats - .contains(currentDecodeFormats) + bool flag = false; + for (var i in supportDecodeFormats) { + if (i.startsWith(currentDecodeFormats.code)) { + flag = true; + } + } + currentDecodeFormats = flag ? currentDecodeFormats : VideoDecodeFormatsCode.fromString(supportDecodeFormats.first)!; } catch (e) { @@ -297,13 +293,6 @@ class VideoDetailController extends GetxController } defaultST = Duration(milliseconds: data.lastPlayTime!); await playerInit(); - - // await playerInit( - // firstVideo, - // audioUrl, - // defaultST: Duration(milliseconds: data.lastPlayTime!), - // duration: data.timeLength ?? 0, - // ); } else { if (result['code'] == -404) { isShowCover.value = false; diff --git a/lib/pages/video/detail/widgets/header_control.dart b/lib/pages/video/detail/widgets/header_control.dart index 77619043..0a84a193 100644 --- a/lib/pages/video/detail/widgets/header_control.dart +++ b/lib/pages/video/detail/widgets/header_control.dart @@ -167,50 +167,46 @@ class _HeaderControlState extends State { /// 选择倍速 void showSetSpeedSheet() { - showModalBottomSheet( - context: context, - elevation: 0, - backgroundColor: Colors.transparent, - builder: (BuildContext context) { - return Container( - width: double.infinity, - height: 450, - clipBehavior: Clip.hardEdge, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.background, - borderRadius: const BorderRadius.all(Radius.circular(12)), - ), - margin: const EdgeInsets.all(12), - child: Material( - child: ListView( - physics: const NeverScrollableScrollPhysics(), + double currentSpeed = widget.controller!.playbackSpeed; + SmartDialog.show( + animationType: SmartAnimationType.centerFade_otherSlide, + builder: (context) { + return AlertDialog( + title: const Text('播放速度'), + contentPadding: const EdgeInsets.fromLTRB(0, 20, 0, 20), + content: StatefulBuilder(builder: (context, StateSetter setState) { + return Column( + mainAxisSize: MainAxisSize.min, children: [ - const SizedBox( - height: 45, - child: Center( - child: Text('播放速度'), - ), - ), - for (var i in playSpeed) ...[ - ListTile( - onTap: () { - widget.controller!.setPlaybackSpeed(i.value); - Get.back(result: {'playbackSpeed': i.value}); - }, - dense: true, - contentPadding: const EdgeInsets.only(left: 20, right: 20), - title: Text(i.description), - trailing: i.value == widget.controller!.playbackSpeed - ? Icon( - Icons.done, - color: Theme.of(context).colorScheme.primary, - ) - : null, - ), - ] + Text('$currentSpeed倍'), + Slider( + min: PlaySpeed.values.first.value, + max: PlaySpeed.values.last.value, + value: currentSpeed, + divisions: PlaySpeed.values.length - 1, + label: '${currentSpeed}x', + onChanged: (double val) => + {setState(() => currentSpeed = val)}, + ) ], + ); + }), + actions: [ + TextButton( + onPressed: () => SmartDialog.dismiss(), + child: Text( + '取消', + style: TextStyle(color: Theme.of(context).colorScheme.outline), + ), ), - ), + TextButton( + onPressed: () async { + await SmartDialog.dismiss(); + widget.controller!.setPlaybackSpeed(currentSpeed); + }, + child: const Text('确定'), + ), + ], ); }, ); diff --git a/lib/plugin/pl_player/models/play_speed.dart b/lib/plugin/pl_player/models/play_speed.dart index 01226ed5..5ccb91a4 100644 --- a/lib/plugin/pl_player/models/play_speed.dart +++ b/lib/plugin/pl_player/models/play_speed.dart @@ -2,11 +2,23 @@ enum PlaySpeed { pointTwoFive, pointFive, pointSevenFive, + one, onePointTwoFive, onePointFive, onePointSevenFive, - two + + two, + twoPointTwoFive, + twoPointFive, + twoPointSevenFive, + + twhree, + threePointTwoFive, + threePointFive, + threePointSevenFive, + + four, } extension PlaySpeedExtension on PlaySpeed { @@ -17,8 +29,15 @@ extension PlaySpeedExtension on PlaySpeed { '正常速度', '1.25倍', '1.5倍', - '1.75倍', '2.0倍', + '2.25倍', + '2.5倍', + '2.75倍', + '3.0倍', + '3.25倍', + '3.5倍', + '3.75倍', + '4.0倍' ]; get description => _descList[index]; @@ -30,7 +49,15 @@ extension PlaySpeedExtension on PlaySpeed { 1.25, 1.5, 1.75, - 2.0 + 2.0, + 2.25, + 2.5, + 2.75, + 3.0, + 3.25, + 3.5, + 3.75, + 4.0, ]; get value => _valueList[index]; get defaultValue => _valueList[3]; diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index 48c016c9..077b5a1b 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -199,22 +199,11 @@ class _PLVideoPlayerState extends State context: Get.context!, useSafeArea: false, builder: (context) => Dialog.fullscreen( - child: Scaffold( - backgroundColor: Colors.black, - appBar: AppBar( - primary: false, - toolbarHeight: 0, - backgroundColor: Colors.black, - systemOverlayStyle: SystemUiOverlayStyle.light, + backgroundColor: Colors.black, + child: PLVideoPlayer( + controller: _, + headerControl: _.headerControl, ), - body: SafeArea( - bottom: false, - child: PLVideoPlayer( - controller: _, - headerControl: _.headerControl, - ), - ), - ), ), ); if (result == null) { diff --git a/lib/plugin/pl_player/widgets/bottom_control.dart b/lib/plugin/pl_player/widgets/bottom_control.dart index 995aef59..f49e9138 100644 --- a/lib/plugin/pl_player/widgets/bottom_control.dart +++ b/lib/plugin/pl_player/widgets/bottom_control.dart @@ -30,12 +30,12 @@ class BottomControl extends StatelessWidget implements PreferredSizeWidget { elevation: 0, scrolledUnderElevation: 0, primary: false, - toolbarHeight: 73, + toolbarHeight: 85, automaticallyImplyLeading: false, titleSpacing: 14, title: Column( children: [ - const SizedBox(height: 23), + const SizedBox(height: 17), Obx( () { final int value = _.sliderPosition.value.inSeconds; @@ -45,7 +45,7 @@ class BottomControl extends StatelessWidget implements PreferredSizeWidget { return Container(); } return Padding( - padding: const EdgeInsets.only(left: 5, right: 5, bottom: 5), + padding: const EdgeInsets.only(left: 7, right: 5, bottom: 6), child: ProgressBar( progress: Duration(seconds: value), buffered: Duration(seconds: buffer), diff --git a/pubspec.lock b/pubspec.lock index 2205250b..f1643599 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -713,20 +713,20 @@ packages: dependency: "direct main" description: name: media_kit - sha256: "0a89e7037002a62701ec319c375586849f9ef8e681820e1dd4a4ff7b843f7542" + sha256: "66f04934bcadf592f24d829127471e4dc304de8e9bba5795ade2f3e95552ebfc" url: "https://pub.dev" source: hosted - version: "1.1.4+1" + version: "1.1.6" media_kit_libs_android_video: - dependency: "direct main" + dependency: transitive description: name: media_kit_libs_android_video - sha256: "142d389bf3efcf8469594a9c7a06a92fc25843fc6c0c3247f76cdcf70b3b29de" + sha256: "498a5062bc5f000bd23ada3be788ea886ab32c52f7a8252dde1264ca019b819b" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.3" media_kit_libs_ios_video: - dependency: "direct main" + dependency: transitive description: name: media_kit_libs_ios_video sha256: fed403dc9d54462e51ee80e0cb23c12a53fadea9a8fa18aca2de9054176d1159 @@ -734,31 +734,39 @@ packages: source: hosted version: "1.1.3" media_kit_libs_linux: - dependency: "direct main" + dependency: transitive description: name: media_kit_libs_linux - sha256: "570bf18ebbd1221caec082657468be05d180510385d3515ec38e0be44fdcc859" + sha256: "3b7c272179639a914dc8a50bf8a3f2df0e9a503bd727c88fab499dbdf6cb1eb8" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" media_kit_libs_macos_video: - dependency: "direct main" + dependency: transitive description: name: media_kit_libs_macos_video sha256: c06e831f3c22a45296d375788d9bc07871b448f8e9ec98d77b11e5e118a83fb2 url: "https://pub.dev" source: hosted version: "1.1.3" - media_kit_libs_windows_video: + media_kit_libs_video: dependency: "direct main" description: - name: media_kit_libs_windows_video - sha256: f33aabd8414470d99e2c91dd98d605e6a5f1c4b8082dd933c10951bc961b9124 + name: media_kit_libs_video + sha256: "48c8ace458f340e6b930c89c48141ea727b80aa0878f7a01904d7d439865f162" url: "https://pub.dev" source: hosted - version: "1.0.7" + version: "1.0.0" + media_kit_libs_windows_video: + dependency: transitive + description: + name: media_kit_libs_windows_video + sha256: "923f068344d7d200184e0aaa2597f3de6c05982a3b1f18035d842ab53f2a1350" + url: "https://pub.dev" + source: hosted + version: "1.0.8" media_kit_native_event_loop: - dependency: "direct main" + dependency: transitive description: name: media_kit_native_event_loop sha256: e37ce6fb5fa71b8cf513c6a6cd591367743a342a385e7da621a047dd8ef6f4a4 @@ -769,10 +777,10 @@ packages: dependency: "direct main" description: name: media_kit_video - sha256: e7fcbe426d42a78ad6696f8f557adb9cbdc012177829026d04992cc106a1c815 + sha256: "809a3797da7d49fad85f139555b352dd615f9d2da6ae9f1745c6978963491bae" url: "https://pub.dev" source: hosted - version: "1.1.5" + version: "1.1.7" meta: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 1ee8abbe..222c9d67 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -79,26 +79,14 @@ dependencies: flutter_smart_dialog: ^4.9.3+2 # 下滑关闭 dismissible_page: ^1.0.2 - # 媒体播放 - # flutter_meedu_media_kit: - # path: /Users/rr/Desktop/code/flutter_meedu_media_kit/package - # git: - # url: https://github.com/guozhigq/flutter_meedu_media_kit.git - # ref: feature-custom - # path: package custom_sliding_segmented_control: ^1.7.5 # 加密 crypto: ^3.0.3 # 视频播放器 - media_kit: ^1.1.4 # Primary package. - media_kit_video: ^1.1.5 # For video rendering. - media_kit_native_event_loop: ^1.0.7 # Support for higher number of concurrent instances & better performance. - media_kit_libs_android_video: ^1.3.2 # Android package for video native libraries. - media_kit_libs_ios_video: ^1.1.3 # iOS package for video native libraries. - media_kit_libs_macos_video: ^1.1.3 # macOS package for video native libraries. - media_kit_libs_windows_video: ^1.0.7 # Windows package for video native libraries. - media_kit_libs_linux: ^1.1.1 + media_kit: ^1.1.6 + media_kit_video: ^1.1.7 + media_kit_libs_video: ^1.0.0 # 音量、亮度、屏幕控制 flutter_volume_controller: ^1.2.7