Quellcode durchsuchen

add DataSource type

Caijinglong vor 6 Jahren
Ursprung
Commit
bd53f91d10
6 geänderte Dateien mit 173 neuen und 1 gelöschten Zeilen
  1. 17 0
      README-EN.md
  2. 16 0
      README.md
  3. 1 1
      TODOLIST.md
  4. 67 0
      example/lib/page/full_screen.dart
  5. 2 0
      example/lib/page/index.dart
  6. 70 0
      lib/src/controller.dart

+ 17 - 0
README-EN.md

@@ -127,6 +127,16 @@ IjkMediaController controller = IjkMediaController();
   );
 ```
 
+### about dispose
+
+Users need to call `dispose` method to release resources when they decide that they will no longer use controllers. If they do not call `dispose` method, the resources will not be released.
+
+Since a `controller` may be attached by multiple `IjkPlayers`, leading to a `controller` controlling multiple `IjkPlayers`, it is not in principle possible to agree with `dispose`of `IjkPlayer`, so the caller needs to dispose of itself here.
+
+```dart
+controller.dispose();
+```
+
 ### Usage of controller
 
 #### DataSource
@@ -141,6 +151,13 @@ await controller.setAssetDataSource("assets/test.mp4");
 // file
 await controller.setFileDataSource(File("/sdcard/1.mp4"));
 
+// dataSource
+var dataSource = DataSource.file(File("/sdcard/1.mp4"));
+var dataSource = DataSource.network("https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4");
+var dataSource = DataSource.asset("assets/test.mp4");
+await controller.setDataSource(dataSource);
+
+
 // autoplay param
 await controller.setNetworkDataSource("https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4",autoPlay : true);
 

+ 16 - 0
README.md

@@ -140,6 +140,16 @@ IjkMediaController controller = IjkMediaController();
   );
 ```
 
+### 关于销毁
+
+用户在确定不再使用 controller 时,需要自己调用 dispose 方法以释放资源,如果不调用,则会造成资源无法释放
+
+因为一个`controller`可能被多个`IjkPlayer`附着, 导致一个`controller`同时控制多个`IjkPlayer`,所以原则上不能与`IjkPlayer`的`dispose`达成一致,所以这里需要调用者自行 dispose
+
+```dart
+controller.dispose();
+```
+
 ### 控制器的使用
 
 #### 设置资源
@@ -156,6 +166,12 @@ await controller.setAssetDataSource("assets/test.mp4");
 // 文件
 await controller.setFileDataSource(File("/sdcard/1.mp4"));
 
+// 通过数据源的方式
+var dataSource = DataSource.file(File("/sdcard/1.mp4"));
+var dataSource = DataSource.network("https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4");
+var dataSource = DataSource.asset("assets/test.mp4");
+await controller.setDataSource(dataSource);
+
 // 还可以添加autoplay参数,这样会在资源准备完成后自动播放
 await controller.setNetworkDataSource("https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4",autoPlay : true);
 

+ 1 - 1
TODOLIST.md

@@ -38,4 +38,4 @@
   - [x] 播放相册
   - [x] 播放 asset
   - [ ] 设置选项的使用
-  - [ ] 全屏播放的示例代码
+  - [ ] 切换全屏播放的示例代码

+ 67 - 0
example/lib/page/full_screen.dart

@@ -0,0 +1,67 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
+
+class FullScreen extends StatefulWidget {
+  @override
+  _FullScreenState createState() => _FullScreenState();
+}
+
+class _FullScreenState extends State<FullScreen> {
+  var controller = IjkMediaController();
+
+  Orientation get orientation => MediaQuery.of(context).orientation;
+
+  @override
+  void initState() {
+    super.initState();
+    controller.setNetworkDataSource(
+      "https://www.sample-videos.com/video123/mp4/360/big_buck_bunny_360p_30mb.mp4",
+      autoPlay: true,
+    );
+  }
+
+  @override
+  void dispose() {
+    controller?.dispose();
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    if (orientation == Orientation.landscape) {
+      return _buildFullScreenPlayer();
+    }
+    return Scaffold(
+      appBar: AppBar(
+        title: Text("切换横竖屏可以看到界面变化"),
+      ),
+      body: ListView(
+        children: <Widget>[
+          _buildPlayerItem(),
+        ],
+      ),
+    );
+  }
+
+  _buildPlayerItem() {
+    return Container(
+      height: 200,
+      child: IjkPlayer(
+        mediaController: controller,
+      ),
+    );
+  }
+
+  _buildFullScreenPlayer() {
+    var data = MediaQuery.of(context);
+    return Material(
+      child: Container(
+        width: data.size.width,
+        height: data.size.height,
+        child: IjkPlayer(
+          mediaController: controller,
+        ),
+      ),
+    );
+  }
+}

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

@@ -1,5 +1,6 @@
 import 'package:flutter/material.dart';
 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';
 
@@ -20,6 +21,7 @@ class _IndexPageState extends State<IndexPage> {
           buildButton("播放网络视频", NetworkPage()),
           buildButton("播放相册视频", PlayGalleryPage()),
           buildButton("播放应用asset", AssetPage()),
+          buildButton("全屏切换示例", FullScreen()),
         ],
       ),
     );

+ 70 - 0
lib/src/controller.dart

@@ -146,6 +146,29 @@ class IjkMediaController {
     }, autoPlay);
   }
 
+  /// Set datasource with [DataSource]
+  Future<void> setDataSource(
+    DataSource source, {
+    bool autoPlay = false,
+  }) async {
+    switch (source.type) {
+      case DataSourceType.asset:
+        await setAssetDataSource(
+          source._assetName,
+          package: source._assetPackage,
+          autoPlay: autoPlay,
+        );
+        break;
+      case DataSourceType.file:
+        await setFileDataSource(source._file, autoPlay: autoPlay);
+        break;
+      case DataSourceType.network:
+        await setNetworkDataSource(source._netWorkUrl);
+        break;
+      default:
+    }
+  }
+
   /// set file DataSource
   Future<void> setFileDataSource(
     File file, {
@@ -336,3 +359,50 @@ class _IjkPlugin {
     });
   }
 }
+
+/// Entity classe for data sources.
+class DataSource {
+  /// See [DataSourceType]
+  DataSourceType type;
+
+  File _file;
+
+  String _assetName;
+
+  String _assetPackage;
+
+  String _netWorkUrl;
+
+  DataSource._();
+
+  /// Create file datasource
+  factory DataSource.file(File file) {
+    var ds = DataSource._();
+    ds._file = file;
+    ds.type = DataSourceType.file;
+    return ds;
+  }
+
+  /// Create network datasource
+  factory DataSource.network(String url) {
+    var ds = DataSource._();
+    ds._netWorkUrl = url;
+    ds.type = DataSourceType.file;
+    return ds;
+  }
+
+  /// Create asset datasource
+  factory DataSource.asset(String assetName, {String package}) {
+    var ds = DataSource._();
+    ds._assetName = assetName;
+    ds._assetPackage = package;
+    ds.type = DataSourceType.asset;
+    return ds;
+  }
+}
+
+enum DataSourceType {
+  network,
+  file,
+  asset,
+}