Jelajahi Sumber

修正了修改iOS系统音量时会卡顿的问题

Caijinglong 6 tahun lalu
induk
melakukan
a5ecfbff98

+ 5 - 4
TODOLIST.md

@@ -14,7 +14,7 @@
   - [x] 控制系统音量
     - [x] 修复 iOS 系统音量与逻辑相反的问题
     - [x] 修复 iOS 系统音量出现系统弹窗的问题
-    - [ ] 修复 iOS 系统音量出现时视频明显卡顿的问题
+    - [x] 修复 iOS 系统音量出现时视频明显卡顿的问题
   - [x] 获取视频信息
     - [x] 宽高
     - [x] 当前播放进度
@@ -22,12 +22,12 @@
     - [x] 视频方向
     - [x] 视频播放速度
       - [x] tcp 速度
-    - [ ] 当前视频编解码器(作为未来备选方案,目前android端可获取,iOS端只有解码器id没有名字)
+    - [ ] 当前视频编解码器(作为未来备选方案,目前 android 端可获取,iOS 端只有解码器 id 没有名字)
       - [ ] 视频
       - [ ] 音频
     - [x] 帧数
       - [x] android
-      - [ ] iOS (目前永远是0,获取的是GL_view的fps)
+      - [ ] iOS (目前永远是 0,获取的是 GL_view  fps)
   - [ ] 控制亮度
 - [x] 默认控制器 UI
   - [x] 进度条
@@ -41,7 +41,7 @@
   - [x] 双击播放/暂停
   - [x] 使用选项切换音量的控制是系统音量还是资源音量
   - [x] 允许根据情况禁用各种控制手势
-  - [ ] 当一个视频是直播视频时,进度条应该隐藏,且无拖动进度相关手势
+  - [x] 当一个视频是直播视频时,进度条应该隐藏,且无拖动进度相关手势
 - [x] 根据视频角度自动旋转
 - [x] 保证图片宽高比不失真
 - [x] 允许自定义控制器 UI
@@ -51,3 +51,4 @@
   - [x] 播放 asset
   - [ ] 设置选项的使用
   - [ ] 切换全屏播放的示例代码
+- [ ] iOS 部分视频无法显示图像的问题: 可能很长时间内都无法解决

+ 4 - 4
example/ios/Podfile.lock

@@ -9,8 +9,8 @@ PODS:
 
 DEPENDENCIES:
   - Flutter (from `.symlinks/flutter/ios`)
-  - flutter_ijkplayer (from `/Users/caijinglong/Documents/GitHub/flutter_ijkplayer/ios/flutter_ijkplayer.podspec`)
-  - photo_manager (from `/Users/caijinglong/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-0.3.3/ios/photo_manager.podspec`)
+  - flutter_ijkplayer (from `/Users/cai/Documents/GitHub/flutter_ijkplayer/ios/flutter_ijkplayer.podspec`)
+  - photo_manager (from `/Users/cai/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-0.3.3/ios/photo_manager.podspec`)
 
 SPEC REPOS:
   https://github.com/cocoapods/specs.git:
@@ -20,9 +20,9 @@ EXTERNAL SOURCES:
   Flutter:
     :path: ".symlinks/flutter/ios"
   flutter_ijkplayer:
-    :path: "/Users/caijinglong/Documents/GitHub/flutter_ijkplayer/ios/flutter_ijkplayer.podspec"
+    :path: "/Users/cai/Documents/GitHub/flutter_ijkplayer/ios/flutter_ijkplayer.podspec"
   photo_manager:
-    :path: "/Users/caijinglong/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-0.3.3/ios/photo_manager.podspec"
+    :path: "/Users/cai/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-0.3.3/ios/photo_manager.podspec"
 
 SPEC CHECKSUMS:
   Flutter: 58dd7d1b27887414a370fcccb9e645c08ffd7a6a

+ 2 - 0
example/lib/page/network.dart

@@ -17,6 +17,8 @@ class _NetworkPageState extends State<NetworkPage> {
         "https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_30mb.mp4";
     editingController.text =
         "http://img.ksbbs.com/asset/Mon_1703/05cacb4e02f9d9e.mp4";
+    editingController.text =
+        "http://172.16.100.245:5000/05-2%20ffmpeg%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8Log%E7%B3%BB%E7%BB%9F.mp4";
   }
 
   @override

+ 3 - 3
example/pubspec.lock

@@ -80,7 +80,7 @@ packages:
       name: pedantic
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.4.0"
+    version: "1.5.0"
   photo:
     dependency: "direct main"
     description:
@@ -113,7 +113,7 @@ packages:
       name: source_span
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "1.5.4"
+    version: "1.5.5"
   stack_trace:
     dependency: transitive
     description:
@@ -164,4 +164,4 @@ packages:
     source: hosted
     version: "2.0.8"
 sdks:
-  dart: ">=2.1.0 <3.0.0"
+  dart: ">=2.2.0 <3.0.0"

+ 51 - 18
ios/Classes/IjkplayerPlugin.m

@@ -15,7 +15,8 @@ static IjkplayerPlugin *__sharedInstance;
 
 @implementation IjkplayerPlugin {
     CoolFlutterIjkManager *manager;
-
+    MPVolumeView *volumeView;
+    UISlider *volumeViewSlider;
 }
 
 + (instancetype)sharedInstance {
@@ -48,7 +49,9 @@ static IjkplayerPlugin *__sharedInstance;
 }
 
 - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result {
+    
     dispatch_queue_t mainQueue = dispatch_get_main_queue();
+    
     dispatch_async(mainQueue, ^{
         if ([@"create" isEqualToString:call.method]) {
             @try {
@@ -76,14 +79,17 @@ static IjkplayerPlugin *__sharedInstance;
             result(@(currentVol));
         } else if ([@"volumeUp" isEqualToString:call.method]) {
             int currentVol = [self getSystemVolume];
-            [self setSystemVolume: currentVol + 10];
+            [self setSystemVolume: currentVol + 3];
             currentVol = [self getSystemVolume];
             result(@(currentVol));
         } else if ([@"volumeDown" isEqualToString:call.method]) {
             int currentVol = [self getSystemVolume];
-            [self setSystemVolume: currentVol - 10];
+            [self setSystemVolume: currentVol - 3];
             currentVol = [self getSystemVolume];
             result(@(currentVol));
+        } else if ([@"hideSystemVolumeBar" isEqualToString:call.method]) {
+            [self hideSystemVolumeBar];
+            result(@YES);
         } else {
             result(FlutterMethodNotImplemented);
         }
@@ -91,27 +97,47 @@ static IjkplayerPlugin *__sharedInstance;
 }
 
 - (int) getSystemVolume{
-    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
-    CGFloat currentVol = audioSession.outputVolume * 100;
-    return (int)currentVol;
+//    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
+//    CGFloat currentVol = audioSession.outputVolume * 100;
+//    NSLog(@"system volume = %.0f",currentVol);
+//    return (int)currentVol;
+    return (int)([self getVolumeWithVolumeView] * 100);
 }
 
-- (void)setSystemVolume:(int)volume {
-    MPVolumeView *volumeView = [[MPVolumeView alloc] init];
-    UISlider *volumeViewSlider = nil;
-    for (UIView *view in [volumeView subviews]) {
-        if ([view.class.description isEqualToString:@"MPVolumeSlider"]) {
-            volumeViewSlider = (UISlider *) view;
-            break;
+- (float) getVolumeWithVolumeView{
+    [self initVolumeView];
+    if(!volumeViewSlider){
+        AVAudioSession *audioSession = [AVAudioSession sharedInstance];
+        CGFloat currentVol = audioSession.outputVolume * 100;
+        NSLog(@"system volume = %.0f",currentVol);
+        return (int)currentVol;
+    }
+    return volumeViewSlider.value;
+}
+
+-(void)initVolumeView{
+    if(!volumeView){
+        volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(-100, 0, 10, 10)];
+    }
+    if(!volumeViewSlider){
+        for (UIView *view in [volumeView subviews]) {
+            if ([view.class.description isEqualToString:@"MPVolumeSlider"]) {
+                volumeViewSlider = (UISlider *) view;
+                break;
+            }
         }
     }
+}
 
-    float targetVolume = ((float) volume) / 100;
+- (void)setSystemVolume:(int)volume {
+    [self initVolumeView];
 
-    volumeView.frame = CGRectMake(-1000, -1000, 100, 100);
+    float targetVolume = ((float) volume) / 100;
 
-    UIWindow *window = UIApplication.sharedApplication.keyWindow;
-    [window addSubview:volumeView];
+    if(volumeView && !volumeView.superview){
+        UIWindow *window = UIApplication.sharedApplication.keyWindow;
+        [window addSubview:volumeView];
+    }
 
     if (targetVolume > 1){
         targetVolume = 1;
@@ -125,7 +151,14 @@ static IjkplayerPlugin *__sharedInstance;
     // send UI control event to make the change effect right now. 立即生效
     [volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside];
     
-    [volumeView removeFromSuperview];
+//    [volumeView removeFromSuperview];
+}
+
+-(void) hideSystemVolumeBar {
+    if(volumeView && volumeView.superview) {
+        [volumeView removeFromSuperview];
+        volumeView = nil;
+    }
 }
 
 @end

+ 4 - 0
lib/src/controller.dart

@@ -320,6 +320,10 @@ class IjkMediaController {
   String toString() {
     return "IJKController[$index]";
   }
+
+  Future<void> hideSystemVolumeBar() async {
+    await IjkManager.hideSystemVolumeBar();
+  }
 }
 
 /// about channel

+ 6 - 0
lib/src/engine/manager.dart

@@ -32,4 +32,10 @@ class IjkManager {
   static Future<int> systemVolumeDown() async {
     return _globalChannel.invokeMethod("volumeDown");
   }
+
+  static Future<void> hideSystemVolumeBar() async {
+    if (Platform.isIOS) {
+      return _globalChannel.invokeMethod("hideSystemVolumeBar");
+    }
+  }
 }

+ 1 - 4
lib/src/widget/controller_widget_builder.dart

@@ -275,10 +275,6 @@ class _DefaultControllerWidgetState extends State<DefaultControllerWidget>
       volumeUp();
     }
 
-    if (widget.volumeType == VolumeType.system && !Platform.isAndroid) {
-      return;
-    }
-
     var currentVolume = await getVolume();
 
     var column = Column(
@@ -301,6 +297,7 @@ class _DefaultControllerWidgetState extends State<DefaultControllerWidget>
 
   void _onVerticalDragEnd(DragEndDetails details) {
     hideTooltip();
+    controller.hideSystemVolumeBar();
 
     Future.delayed(Duration(seconds: 2), () {
       hideTooltip();