Browse Source

尝试修改库,暂时使用本地库

Caijinglong 6 years ago
parent
commit
0e662578cf

+ 1 - 8
example/ios/Podfile.lock

@@ -2,8 +2,6 @@ PODS:
   - Flutter (1.0.0)
   - flutter_ijkplayer (0.0.1):
     - Flutter
-    - FlutterIJK (~> 0.0.6)
-  - FlutterIJK (0.0.6)
   - photo_manager (0.0.1):
     - Flutter
 
@@ -12,10 +10,6 @@ DEPENDENCIES:
   - 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:
-    - FlutterIJK
-
 EXTERNAL SOURCES:
   Flutter:
     :path: ".symlinks/flutter/ios"
@@ -26,8 +20,7 @@ EXTERNAL SOURCES:
 
 SPEC CHECKSUMS:
   Flutter: 58dd7d1b27887414a370fcccb9e645c08ffd7a6a
-  flutter_ijkplayer: 6e17431ef86df3ab4c9e8acf91a34d174a20d3db
-  FlutterIJK: fef71db3a6d8d26b32e793cd9c2cf30b3ca56b4d
+  flutter_ijkplayer: 3fd33f0f3083d5488399d75a98fc71746bb7de08
   photo_manager: d47ddf6cb25cbfa837dc334540eb9a99b208e191
 
 PODFILE CHECKSUM: a14c63eb48a9d676ed6d876506b3258fd9c85235

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

@@ -3,6 +3,7 @@ import 'package:ijkplayer_example/page/asset_page.dart';
 import 'package:ijkplayer_example/page/full_screen.dart';
 import 'package:ijkplayer_example/page/gallery_page.dart';
 import 'package:ijkplayer_example/page/network.dart';
+import 'package:ijkplayer_example/page/video_list.dart';
 
 class IndexPage extends StatefulWidget {
   @override
@@ -21,6 +22,7 @@ class _IndexPageState extends State<IndexPage> {
           buildButton("播放网络视频", NetworkPage()),
           buildButton("播放相册视频", PlayGalleryPage()),
           buildButton("播放应用asset", AssetPage()),
+          buildButton("ListView中插入视频", VideoList()),
           buildButton("全屏切换示例", FullScreen()),
         ],
       ),

+ 150 - 0
example/lib/page/video_list.dart

@@ -0,0 +1,150 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
+
+class VideoList extends StatefulWidget {
+  @override
+  _VideoListState createState() => _VideoListState();
+}
+
+class _VideoListState extends State<VideoList> {
+  var list = <DataSource>[
+    DataSource.network(
+        "https://www.sample-videos.com/video123/mp4/360/big_buck_bunny_360p_30mb.mp4"),
+    DataSource.network(
+        "https://www.sample-videos.com/video123/mp4/360/big_buck_bunny_360p_30mb.mp4"),
+    DataSource.asset("assets/sample1.mp4")
+  ];
+
+  var map = <DataSource, IjkMediaController>{};
+
+  @override
+  void initState() {
+    super.initState();
+    for (var data in list) {
+      var controller = IjkMediaController();
+      map[data] = controller;
+//      controller.setDataSource(data);
+    }
+  }
+
+  @override
+  void dispose() {
+    map.values.forEach((c) {
+      c.dispose();
+    });
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: Text("列表中IJKPlayer"),
+      ),
+      body: ListView.separated(
+        itemBuilder: _buildItem,
+        separatorBuilder: (BuildContext context, int index) {
+          return Container(
+            height: 10.0,
+            color: Colors.blue,
+          );
+        },
+        itemCount: list.length,
+      ),
+    );
+  }
+
+  Widget _buildItem(BuildContext context, int index) {
+    return Container(
+      child: VideoItem(list[index]),
+      height: 150,
+    );
+  }
+}
+
+class VideoItem extends StatefulWidget {
+  final DataSource dataSource;
+
+  VideoItem(this.dataSource);
+
+  @override
+  _VideoItemState createState() => _VideoItemState();
+}
+
+class _VideoItemState extends State<VideoItem> {
+  IjkMediaController controller;
+
+  var isInit = false;
+  var isLoading = false;
+
+  @override
+  void initState() {
+    super.initState();
+    controller = IjkMediaController();
+  }
+
+  @override
+  void dispose() {
+    controller?.dispose();
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    if (!isInit) {
+      Widget stateButton = IconButton(
+        icon: Icon(Icons.play_arrow),
+        onPressed: _play,
+        color: Colors.white,
+      );
+
+      if (isLoading) {
+        stateButton = CircularProgressIndicator();
+      }
+
+      var center = Center(
+        child: Container(
+          width: 60.0,
+          height: 60.0,
+          child: stateButton,
+        ),
+      );
+
+      return Stack(
+        children: <Widget>[
+          Container(
+            color: Colors.black,
+          ),
+          center,
+        ],
+      );
+    }
+
+    var ijkPlayer = IjkPlayer(
+      mediaController: controller,
+      controllerWidgetBuilder: _buildControllerWidget,
+    );
+    return ijkPlayer;
+  }
+
+  void _play() async {
+    setState(() {
+      isLoading = true;
+    });
+    await controller.setDataSource(widget.dataSource, autoPlay: true);
+    await controller.pauseOtherIjkMedia();
+    setState(() {
+      isLoading = false;
+      isInit = true;
+    });
+  }
+
+  Widget _buildControllerWidget(IjkMediaController controller) {
+    return DefaultControllerWidget(
+      controller: controller,
+      verticalGesture: false,
+    );
+  }
+}
+
+class PauseOtherNotification extends Notification {}

+ 4 - 1
ios/flutter_ijkplayer.podspec

@@ -18,7 +18,10 @@ A new flutter plugin project.
 
   s.ios.deployment_target = '8.0'
 
-  s.dependency 'FlutterIJK', '~> 0.0.6'
+  s.ios.vendored_frameworks = 'IJKMediaFramework.framework'
+  s.frameworks  = "AudioToolbox", "AVFoundation", "CoreGraphics", "CoreMedia", "CoreVideo", "MobileCoreServices", "OpenGLES", "QuartzCore", "VideoToolbox", "Foundation", "UIKit", "MediaPlayer"
+  s.libraries   = "bz2", "z", "stdc++"
+  # s.dependency 'FlutterIJK', '~> 0.0.6'
 
 end
 

+ 17 - 5
lib/src/controller.dart

@@ -5,7 +5,9 @@ class IjkMediaController {
   /// MediaController
   IjkMediaController({
     this.autoRotate = true,
-  });
+  }) {
+    IjkMediaPlayerManager().add(this);
+  }
 
   /// texture id from native
   int _textureId;
@@ -113,6 +115,8 @@ class IjkMediaController {
     _videoInfoController = null;
     _textureIdController = null;
     _volumeController = null;
+
+    IjkMediaPlayerManager().remove(this);
   }
 
   /// dispose all resource
@@ -163,7 +167,7 @@ class IjkMediaController {
         await setFileDataSource(source._file, autoPlay: autoPlay);
         break;
       case DataSourceType.network:
-        await setNetworkDataSource(source._netWorkUrl);
+        await setNetworkDataSource(source._netWorkUrl, autoPlay: autoPlay);
         break;
       default:
     }
@@ -195,13 +199,15 @@ class IjkMediaController {
   }
 
   /// Play or pause according to your current status
-  Future<void> playOrPause() async {
+  Future<void> playOrPause({
+    pauseOther = false,
+  }) async {
     var videoInfo = await getVideoInfo();
     var playing = videoInfo.isPlaying;
     if (playing) {
       await _plugin?.pause();
     } else {
-      await _plugin?.play();
+      await _plugin?.play(pauseOther: pauseOther);
     }
     refreshVideoInfo();
   }
@@ -252,6 +258,8 @@ class IjkMediaController {
   void _autoPlay(bool autoPlay) {
     if (autoPlay) {
       eventChannel?.autoPlay(this);
+    } else {
+      eventChannel?.disableAutoPlay(this);
     }
   }
 
@@ -278,6 +286,10 @@ class IjkMediaController {
   Future<void> setSystemVolume(int volume) async {
     await IjkManager.setSystemVolume(volume);
   }
+
+  Future<void> pauseOtherIjkMedia() async {
+    await IjkMediaPlayerManager().pauseOther(this);
+  }
 }
 
 /// about channel
@@ -300,7 +312,7 @@ class _IjkPlugin {
     await _globalChannel.invokeMethod("dispose", {"id": textureId});
   }
 
-  Future<void> play() async {
+  Future<void> play({bool pauseOther = false}) async {
     await channel.invokeMethod("play");
   }
 

+ 39 - 0
lib/src/engine/ijk_controller_manager.dart

@@ -0,0 +1,39 @@
+import 'package:flutter_ijkplayer/src/ijkplayer.dart';
+
+class IjkMediaPlayerManager {
+  final ijkPlayerList = <IjkMediaController>[];
+
+  static IjkMediaPlayerManager _instance;
+
+  factory IjkMediaPlayerManager() {
+    _instance ??= IjkMediaPlayerManager._();
+    return _instance;
+  }
+
+  IjkMediaPlayerManager._();
+
+  void add(IjkMediaController ijkMediaController) {
+    ijkPlayerList.add(ijkMediaController);
+  }
+
+  void remove(IjkMediaController ijkMediaController) {
+    ijkPlayerList.remove(ijkMediaController);
+  }
+
+  Future<void> pauseOther(IjkMediaController ijkMediaController) async {
+    await todoOther(ijkMediaController, (ctl) {
+      ctl.pause();
+    });
+  }
+
+  Future<void> todoOther(
+    IjkMediaController ijkMediaController,
+    Future<void> todo(IjkMediaController ijkMediaController),
+  ) async {
+    for (var item in ijkPlayerList) {
+      if (item != ijkMediaController) {
+        await todo(item);
+      }
+    }
+  }
+}

+ 10 - 1
lib/src/ijk_event_channel.dart

@@ -72,7 +72,7 @@ class _IJKEventChannel {
     return _prepareCompleter.future;
   }
 
-  void autoPlay(IjkMediaController ijkMediaController) async {
+  autoPlay(IjkMediaController ijkMediaController) async {
     try {
       await waitPrepare();
       ijkMediaController.play();
@@ -81,6 +81,15 @@ class _IJKEventChannel {
     }
   }
 
+  disableAutoPlay(IjkMediaController ijkMediaController) async {
+    try {
+      await waitPrepare();
+      ijkMediaController.pause();
+    } catch (e) {
+      LogUtils.log(e);
+    }
+  }
+
   void onRotateChanged(MethodCall call) {
     var info = getInfo(call);
     LogUtils.log("onRotateChanged , info = $info");

+ 5 - 0
lib/src/ijkplayer.dart

@@ -9,6 +9,7 @@ import 'logutil.dart';
 import 'video_info.dart';
 import 'widget/controller_widget_builder.dart';
 import 'widget/ijkplayer_builder.dart';
+import 'engine/ijk_controller_manager.dart';
 
 part 'controller.dart';
 
@@ -19,7 +20,11 @@ part 'manager.dart';
 /// Main Classes of Library
 class IjkPlayer extends StatefulWidget {
   final IjkMediaController mediaController;
+
+  /// See [DefaultControllerWidget]
   final ControllerWidgetBuilder controllerWidgetBuilder;
+
+  /// See [buildDefaultIjkPlayer]
   final PlayerBuilder playerBuilder;
 
   /// Main Classes of Library

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

@@ -427,7 +427,7 @@ class PortraitController extends StatelessWidget {
   }
 
   Widget buildProgress(VideoInfo info) {
-    if (info.duration == 0) {
+    if (!info.hasData || info.duration == 0) {
       return Container();
     }
     return Container(