فهرست منبع

修改了dart和android部分的自动播放逻辑
iOS找到了修改点

Caijinglong 6 سال پیش
والد
کامیت
d0d1488ce6

+ 3 - 3
README.md

@@ -67,11 +67,11 @@ dependencies:
 
 ### 自定义编译和原生部分源码
 
-自定义编译的主要目的是修改支持的格式, 因为默认包含了一些格式, 这些格式
+自定义编译的主要目的是修改支持的格式, 因为默认包含了一些编解码器,解复用,协议等等, 这些格式可能你的项目用不到, 这时候可以修改 ffmpeg 的自定义编译选项, 以便于可以缩小库文件的体积, 以达到给 app 瘦身的目的
 
-[当前的编译规则文件](https://gitee.com/kikt/ijkplayer_thrid_party/blob/master/config/module.sh),如果你有自己的特定需求,可以修改编译选项,这个参考 [bilibili/ijkplayer](https://github.com/bilibili/ijkplayer) 或 [ffmpeg](http://ffmpeg.org/)
+[当前的编译规则文件](https://gitee.com/kikt/ijkplayer_thrid_party/blob/master/config/module.sh),修改编译选项,这个参考 [bilibili/ijkplayer](https://github.com/bilibili/ijkplayer) 或 [ffmpeg](http://ffmpeg.org/),ffmpeg 的相关信息也可以通过搜索引擎获取
 
-自定义编译选项的完整过程请看[文档](https://github.com/CaiJingLong/flutter_ijkplayer/blob/master/compile-cn.md),否则不保证编译出来的代码不报错, 具体的更改方案也请查看编译文档,本篇不再提及
+自定义编译选项的完整过程请看[文档](https://github.com/CaiJingLong/flutter_ijkplayer/blob/master/compile-cn.md), 否则不保证编译出来的代码不报错, 具体的更改方案也请查看编译文档, 本篇不再提及
 
 ### iOS
 

+ 33 - 0
example/lib/page/developing/develop_index.dart

@@ -0,0 +1,33 @@
+import 'package:flutter/material.dart';
+
+import 'develop_prepare_page.dart';
+
+class DevelopingIndexPage extends StatefulWidget {
+  @override
+  DevelopingIndexPageState createState() => DevelopingIndexPageState();
+}
+
+class DevelopingIndexPageState extends State<DevelopingIndexPage> {
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: Text("开发中"),
+      ),
+      body: ListView(
+        children: <Widget>[
+          buildButton("developing preare page", ForPreparePage()),
+        ],
+      ),
+    );
+  }
+
+  Widget buildButton(String text, Widget targetPage) {
+    return FlatButton(
+      onPressed: () {
+        Navigator.push(context, MaterialPageRoute(builder: (_) => targetPage));
+      },
+      child: Text(text),
+    );
+  }
+}

+ 48 - 0
example/lib/page/developing/develop_prepare_page.dart

@@ -0,0 +1,48 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
+
+class ForPreparePage extends StatefulWidget {
+  @override
+  _ForPreparePageState createState() => _ForPreparePageState();
+}
+
+class _ForPreparePageState extends State<ForPreparePage> {
+  IjkMediaController controller = IjkMediaController();
+
+  @override
+  void initState() {
+    super.initState();
+    initPlayer();
+  }
+
+  @override
+  void dispose() {
+    controller.dispose();
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: Text("prepare属性"),
+      ),
+      body: Column(
+        children: <Widget>[
+          Container(
+            child: IjkPlayer(mediaController: controller),
+            height: 300,
+          ),
+        ],
+      ),
+    );
+  }
+
+  Future initPlayer() async {
+    await controller.setDataSource(
+      DataSource.asset("assets/sample1.mp4"),
+      autoPlay: false,
+    );
+    controller.play();
+  }
+}

+ 4 - 1
example/lib/page/index.dart

@@ -4,11 +4,13 @@ import 'package:ijkplayer_example/page/screen_shot_page.dart';
 import 'package:ijkplayer_example/page/video_list.dart';
 
 import '../i18n/i18n.dart';
-import 'error_url.dart';
 import 'asset_page.dart';
 import 'controller_stream_use.dart';
 import 'custom_ijk_opt_page.dart';
+import 'package:ijkplayer_example/page/developing/develop_prepare_page.dart';
+import 'developing/develop_index.dart';
 import 'dialog_video_page.dart';
+import 'error_url.dart';
 import 'full_screen.dart';
 import 'gallery_page.dart';
 import 'ijk_status_page.dart';
@@ -29,6 +31,7 @@ class _IndexPageState extends State<IndexPage> {
       ),
       body: ListView(
         children: <Widget>[
+          buildButton("For developer, user don't use.", DevelopingIndexPage()),
           buildButton(currentI18n.networkButton, NetworkPage()),
           buildButton(currentI18n.photoButton, PlayGalleryPage()),
           buildButton(currentI18n.assetButton, AssetPage()),

+ 2 - 0
ios/Classes/CoolIjkNotifyChannel.m

@@ -122,6 +122,8 @@
 }
 
 - (void)loadStateDidChange:(NSNotification *)notification {
+    NSLog(@"load state change, state = %d", _controller.loadState);
+    // todo 添加回调逻辑通知返回加载结果, 确定是否可播放
 //    [channel invokeMethod:@"loadStateChange" arguments:[self getInfo]];
 }
 

+ 32 - 26
lib/src/controller/controller.dart

@@ -40,6 +40,8 @@ class IjkMediaController
         options.addAll(opt);
       }
 
+      print("options = $options");
+
       var id = await _createIjk(options: options);
       this.textureId = id;
       _plugin = _IjkPlugin(id);
@@ -82,13 +84,12 @@ class IjkMediaController
     bool autoPlay = false,
   }) async {
     _ijkStatus = IjkStatus.preparing;
-    await _initDataSource(() async {
-      await _plugin?.setNetworkDataSource(
-        uri: url,
-        headers: headers,
-      );
-      _ijkStatus = IjkStatus.prepared;
-    }, autoPlay);
+    await _initDataSource(autoPlay);
+    await _plugin?.setNetworkDataSource(
+      uri: url,
+      headers: headers,
+    );
+    _ijkStatus = IjkStatus.prepared;
   }
 
   /// set asset DataSource
@@ -100,10 +101,9 @@ class IjkMediaController
     bool autoPlay = false,
   }) async {
     _ijkStatus = IjkStatus.preparing;
-    await _initDataSource(() async {
-      await _plugin?.setAssetDataSource(name, package);
-      _ijkStatus = IjkStatus.prepared;
-    }, autoPlay);
+    await _initDataSource(autoPlay);
+    await _plugin?.setAssetDataSource(name, package);
+    _ijkStatus = IjkStatus.prepared;
   }
 
   /// set file DataSource
@@ -114,10 +114,9 @@ class IjkMediaController
     bool autoPlay = false,
   }) async {
     _ijkStatus = IjkStatus.preparing;
-    await _initDataSource(() async {
-      await _plugin?.setFileDataSource(file.absolute.path);
-      _ijkStatus = IjkStatus.prepared;
-    }, autoPlay);
+    await _initDataSource(autoPlay);
+    await _plugin?.setFileDataSource(file.absolute.path);
+    _ijkStatus = IjkStatus.prepared;
   }
 
   /// Set datasource with [DataSource]
@@ -150,24 +149,31 @@ class IjkMediaController
     }
   }
 
+  void setAutoPlay() {
+    this.addIjkPlayerOptions([
+      TargetPlatform.android,
+      TargetPlatform.iOS,
+    ], [
+      IjkOption(IjkOptionCategory.player, "start-on-prepared", 0),
+    ]);
+  }
+
   /// dispose last textureId resource
-  Future<void> _initDataSource(
-    Future setDataSource(),
-    bool autoPlay,
-  ) async {
+  Future<void> _initDataSource(bool autoPlay) async {
     autoPlay ??= false;
 
+    var autoPlayValue = autoPlay ? 1 : 0;
+    addIjkPlayerOptions([
+      TargetPlatform.android,
+      TargetPlatform.iOS,
+    ], [
+      IjkOption(IjkOptionCategory.player, "start-on-prepared", autoPlayValue),
+    ]);
+
     if (this.textureId != null) {
       await _plugin?.dispose();
     }
     await _initIjk();
-    Future playFuture = _autoPlay(autoPlay);
-    try {
-      await setDataSource();
-    } on Exception catch (e) {
-      print("init data error is ${e.toString()}");
-    }
-    return playFuture;
   }
 
   /// Play or pause according to your current status

+ 5 - 0
lib/src/entity/options.dart

@@ -44,4 +44,9 @@ class IjkOption {
     }
     return this.category == other.category && this.key == other.key;
   }
+
+  @override
+  String toString() {
+    return 'IjkOption{category: $category, key: $key, value: $value}';
+  }
 }