Просмотр исходного кода

完成了dart ,android 主动控制部分的代码构建

Caijinglong 6 лет назад
Родитель
Сommit
2c06f04042

+ 10 - 13
android/src/main/java/com/example/ijkplayer/IJK.kt

@@ -3,14 +3,14 @@ package com.example.ijkplayer
 /// create 2019/3/7 by cai
 
 
-import android.net.Uri
 import io.flutter.plugin.common.PluginRegistry
 import tv.danmaku.ijk.media.player.IjkMediaPlayer
 import tv.danmaku.ijk.media.player.TextureMediaPlayer
+import java.util.concurrent.Executors
 
 class IJK(private val registry: PluginRegistry.Registrar) {
     private val textureEntry = registry.textures().createSurfaceTexture()
-
+    private val threadPool = Executors.newCachedThreadPool()
     val id: Long
         get() = textureEntry.id()
 
@@ -22,29 +22,22 @@ class IJK(private val registry: PluginRegistry.Registrar) {
         mediaPlayer.surfaceTexture = textureEntry.surfaceTexture()
     }
 
-    fun setUri(uri: String, callback: () -> Unit) {
-        mediaPlayer.setDataSource(registry.activeContext(), Uri.parse(uri))
-        mediaPlayer.setOnPreparedListener {
-            callback()
-        }
-    }
-
-    fun setNetUri(uri: String, callback: () -> Unit) {
+    fun setUri(uri: String, callback: (Throwable?) -> Unit) {
         try {
             ijkPlayer.setOnPreparedListener {
-                callback()
+                callback(null)
             }
             ijkPlayer.dataSource = uri
             ijkPlayer.prepareAsync()
         } catch (e: Exception) {
             e.printStackTrace()
+            callback(e)
         }
     }
 
     fun dispose() {
-        mediaPlayer.releaseSurfaceTexture()
+        mediaPlayer.stop()
         mediaPlayer.release()
-        ijkPlayer.release()
         textureEntry.release()
     }
 
@@ -65,6 +58,10 @@ class IJK(private val registry: PluginRegistry.Registrar) {
         mediaPlayer.stop()
     }
 
+    fun reset() {
+        mediaPlayer.reset()
+    }
+
     fun seekTo(msec: Long) {
         mediaPlayer.seekTo(msec)
     }

+ 30 - 12
android/src/main/java/com/example/ijkplayer/IjkplayerPlugin.kt

@@ -12,33 +12,43 @@ import io.flutter.plugin.common.PluginRegistry.Registrar
 class IjkplayerPlugin(private val registrar: Registrar) : MethodCallHandler {
 
     private val manager: IjkManager = IjkManager(registrar)
+    //    private val threadPool = Executors.newScheduledThreadPool(10)
+//    private val handler = Handler(Looper.getMainLooper())
+//
+//    private inline fun runOnMainThread(crossinline runnable: () -> Unit) {
+//        handler.post {
+//            runnable()
+//        }
+//    }
 
     override fun onMethodCall(call: MethodCall, result: Result) {
+        handleMethodCall(call, result)
+    }
+
+    private fun handleMethodCall(call: MethodCall, result: Result) {
         when (call.method) {
             "create" -> {
                 try {
                     val ijk = manager.create()
                     result.success(ijk.id)
                 } catch (e: Exception) {
-                    result.error("error", "创建失败", null)
+                    result.error("1", "创建失败", e)
                 }
             }
             "dispose" -> {
-                val id = call.arguments<Long>()
+                val id = call.getLongArg()
                 manager.dispose(id)
             }
-            "setData" -> {
-                val id = call.argument<Int>("id")!!
-                val uri = call.argument<String>("uri")!!
-                manager.findIJK(id.toLong())?.setUri(uri) {
-                    result.success(1)
-                }
-            }
-            "setNetData" -> {
+            "setDataSource" -> {
                 val id = call.argument<Int>("id")!!
                 val uri = call.argument<String>("uri")!!
-                manager.findIJK(id.toLong())?.setNetUri(uri) {
-                    result.success(1)
+                manager.findIJK(id.toLong())?.setUri(uri) { throwable ->
+                    if (throwable == null) {
+                        result.success(throwable)
+                    } else {
+                        throwable.printStackTrace()
+                        result.error("2", "加载失败", throwable)
+                    }
                 }
             }
             "play" -> {
@@ -58,6 +68,14 @@ class IjkplayerPlugin(private val registrar: Registrar) : MethodCallHandler {
         }
     }
 
+    fun MethodCall.getLongArg(key: String): Long {
+        return this.argument<Int>(key)!!.toLong()
+    }
+
+    fun MethodCall.getLongArg(): Long {
+        return this.arguments<Int>().toLong()
+    }
+
     companion object {
 
         /**

+ 5 - 6
example/lib/main.dart

@@ -1,6 +1,5 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
-import 'package:permission/permission.dart';
 
 void main() => runApp(MyApp());
 
@@ -24,12 +23,11 @@ class HomePage extends StatefulWidget {
 }
 
 class HomePageState extends State<HomePage> {
-  IjkController controller = IjkController();
+  IjkMediaController controller = IjkMediaController();
 
   @override
   void initState() {
     super.initState();
-    controller.initIjk();
   }
 
   @override
@@ -61,12 +59,13 @@ class HomePageState extends State<HomePage> {
       floatingActionButton: FloatingActionButton(
         child: Icon(Icons.play_arrow),
         onPressed: () async {
-          await Permission.requestPermissions([PermissionName.Storage]);
-          await controller.initIjk();
-          await controller.setNetData(
+          await controller.setDataSource(
             'https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4',
+            // 'https://www.sample-videos.com/video123/flv/720/big_buck_bunny_720p_10mb.flv',
+            // 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/playlist.m3u8',
             // "file:///sdcard/Download/Sample1.mp4",
           );
+          print("set data source success");
           controller.play();
         },
       ),

+ 0 - 8
example/pubspec.lock

@@ -81,13 +81,6 @@ packages:
       url: "https://pub.flutter-io.cn"
     source: hosted
     version: "1.5.0"
-  permission:
-    dependency: transitive
-    description:
-      name: permission
-      url: "https://pub.flutter-io.cn"
-    source: hosted
-    version: "0.1.1"
   quiver:
     dependency: transitive
     description:
@@ -158,4 +151,3 @@ packages:
     version: "2.0.8"
 sdks:
   dart: ">=2.1.1-dev.0.0 <3.0.0"
-  flutter: ">=0.1.4 <2.0.0"

+ 2 - 2
example/test/widget_test.dart

@@ -18,8 +18,8 @@ void main() {
     // Verify that platform version is retrieved.
     expect(
       find.byWidgetPredicate(
-        (Widget widget) => widget is Text &&
-                           widget.data.startsWith('Running on:'),
+        (Widget widget) =>
+            widget is Text && widget.data.startsWith('Running on:'),
       ),
       findsOneWidget,
     );

+ 15 - 16
lib/src/controller.dart

@@ -1,11 +1,13 @@
 part of './ijkplayer.dart';
 
-class IjkController extends ChangeNotifier {
+/// Media Controller
+class IjkMediaController extends ChangeNotifier {
+  /// textureId
   int textureId;
 
   bool get isInit => textureId == null;
 
-  Future initIjk() async {
+  Future _initIjk() async {
     try {
       var id = await _IjkPlugin.createIjk();
       this.textureId = id;
@@ -16,18 +18,20 @@ class IjkController extends ChangeNotifier {
   }
 
   void dispose() {
-    super.dispose();
     var id = textureId;
     this.textureId = null;
+    this.notifyListeners();
+    super.dispose();
     _IjkPlugin.dispose(id);
   }
 
-  Future setData(String url) async {
-    await _IjkPlugin.setData(id: this.textureId, uri: url);
-  }
-
-  Future setNetData(String uri) async {
-    await _IjkPlugin.setNetData(id: this.textureId, uri: uri);
+  Future setDataSource(String url) async {
+    if (this.textureId != null) {
+      await _IjkPlugin.dispose(this.textureId);
+    }
+    await _initIjk();
+    await _IjkPlugin.setDataSource(id: this.textureId, uri: url);
+    this.notifyListeners();
   }
 
   Future play() async {
@@ -60,13 +64,8 @@ class _IjkPlugin {
     channel.invokeMethod("stop", id);
   }
 
-  static Future setData({int id, String uri}) async {
-    print("id = $id , uri = $uri");
-    channel.invokeMethod("setData", {"id": id, "uri": uri});
-  }
-
-  static Future setNetData({int id, String uri}) async {
+  static Future setDataSource({int id, String uri}) async {
     print("id = $id , uri = $uri");
-    channel.invokeMethod("setNetData", {"id": id, "uri": uri});
+    channel.invokeMethod("setDataSource", {"id": id, "uri": uri});
   }
 }

+ 10 - 5
lib/src/ijkplayer.dart

@@ -6,7 +6,7 @@ import 'package:flutter/services.dart';
 part './controller.dart';
 
 class IjkPlayer extends StatefulWidget {
-  final IjkController controller;
+  final IjkMediaController controller;
 
   const IjkPlayer({Key key, this.controller}) : super(key: key);
 
@@ -15,7 +15,7 @@ class IjkPlayer extends StatefulWidget {
 }
 
 class _IjkPlayerState extends State<IjkPlayer> {
-  IjkController get controller => widget.controller;
+  IjkMediaController get controller => widget.controller;
 
   StreamController<int> _streamController = StreamController.broadcast();
 
@@ -53,11 +53,16 @@ class _IjkPlayerState extends State<IjkPlayer> {
 
   Widget _buildContent(int id) {
     if (id == null) {
-      return Container();
+      return Container(
+        color: Colors.black,
+      );
     }
 
-    return Texture(
-      textureId: id,
+    return Container(
+      color: Colors.black,
+      child: Texture(
+        textureId: id,
+      ),
     );
   }
 }

+ 0 - 8
pubspec.lock

@@ -67,13 +67,6 @@ packages:
       url: "https://pub.flutter-io.cn"
     source: hosted
     version: "1.5.0"
-  permission:
-    dependency: "direct main"
-    description:
-      name: permission
-      url: "https://pub.flutter-io.cn"
-    source: hosted
-    version: "0.1.1"
   quiver:
     dependency: transitive
     description:
@@ -144,4 +137,3 @@ packages:
     version: "2.0.8"
 sdks:
   dart: ">=2.1.1-dev.0.0 <3.0.0"
-  flutter: ">=0.1.4 <2.0.0"

+ 0 - 1
pubspec.yaml

@@ -10,7 +10,6 @@ environment:
 dependencies:
   flutter:
     sdk: flutter
-  permission: ^0.1.1
 
 dev_dependencies:
   flutter_test: