浏览代码

android 部分的通信基础架构修改完毕

Caijinglong 6 年之前
父节点
当前提交
508dc2aecc

+ 1 - 1
android/.project

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
 <projectDescription>
-	<name>ijkplayer</name>
+	<name>flutter_ijkplayer</name>
 	<comment>Project ijkplayer created by Buildship.</comment>
 	<comment>Project ijkplayer created by Buildship.</comment>
 	<projects>
 	<projects>
 	</projects>
 	</projects>

+ 1 - 1
android/.settings/org.eclipse.buildship.core.prefs

@@ -1,2 +1,2 @@
-connection.project.dir=
+connection.project.dir=../example/android
 eclipse.preferences.version=1
 eclipse.preferences.version=1

+ 0 - 74
android/src/main/java/com/example/ijkplayer/IJK.kt

@@ -1,74 +0,0 @@
-package com.example.ijkplayer
-
-/// create 2019/3/7 by cai
-
-
-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()
-
-    private val ijkPlayer: IjkMediaPlayer = IjkMediaPlayer()
-    private val mediaPlayer: TextureMediaPlayer
-
-    init {
-        mediaPlayer = TextureMediaPlayer(ijkPlayer)
-        mediaPlayer.surfaceTexture = textureEntry.surfaceTexture()
-    }
-
-    fun setUri(uri: String, callback: (Throwable?) -> Unit) {
-        try {
-            ijkPlayer.setOnPreparedListener {
-                callback(null)
-            }
-            ijkPlayer.dataSource = uri
-            ijkPlayer.prepareAsync()
-        } catch (e: Exception) {
-            e.printStackTrace()
-            callback(e)
-        }
-    }
-
-    fun dispose() {
-        mediaPlayer.stop()
-        mediaPlayer.release()
-        textureEntry.release()
-    }
-
-    fun play() {
-        try {
-            mediaPlayer.start()
-//            ijkPlayer.start()
-        } catch (e: Exception) {
-            e.printStackTrace()
-        }
-    }
-
-    fun pause() {
-        mediaPlayer.pause()
-    }
-
-    fun stop() {
-        mediaPlayer.stop()
-    }
-
-    fun reset() {
-        mediaPlayer.reset()
-    }
-
-    fun seekTo(msec: Long) {
-        mediaPlayer.seekTo(msec)
-    }
-
-    fun getDuration(): Long {
-        return mediaPlayer.duration
-    }
-
-}
-

+ 105 - 0
android/src/main/java/com/example/ijkplayer/Ijk.kt

@@ -0,0 +1,105 @@
+package com.example.ijkplayer
+
+/// create 2019/3/7 by cai
+
+
+import io.flutter.plugin.common.MethodCall
+import io.flutter.plugin.common.MethodChannel
+import io.flutter.plugin.common.PluginRegistry
+import tv.danmaku.ijk.media.player.IjkMediaPlayer
+import tv.danmaku.ijk.media.player.TextureMediaPlayer
+
+class Ijk(registry: PluginRegistry.Registrar) : MethodChannel.MethodCallHandler {
+
+    private val textureEntry = registry.textures().createSurfaceTexture()
+    val id: Long
+        get() = textureEntry.id()
+
+    private val ijkPlayer: IjkMediaPlayer = IjkMediaPlayer()
+    private val mediaPlayer: TextureMediaPlayer
+
+    private val methodChannel: MethodChannel = MethodChannel(registry.messenger(), "top.kikt/ijkplayer/$id")
+
+    init {
+        mediaPlayer = TextureMediaPlayer(ijkPlayer)
+        mediaPlayer.surfaceTexture = textureEntry.surfaceTexture()
+        methodChannel.setMethodCallHandler(this)
+    }
+
+    override fun onMethodCall(call: MethodCall?, result: MethodChannel.Result?) {
+        when (call?.method) {
+            "dispose" -> {
+                IjkplayerPlugin.manager.dispose(id)
+            }
+            "setDataSource" -> {
+                val uri = call.argument<String>("uri")!!
+                setUri(uri) { throwable ->
+                    if (throwable == null) {
+                        result?.success(throwable)
+                    } else {
+                        throwable.printStackTrace()
+                        result?.error("2", "加载失败", throwable)
+                    }
+                }
+            }
+            "play" -> {
+                play()
+                result?.success(1)
+            }
+            "pause" -> {
+                pause()
+            }
+            "stop" -> {
+                stop()
+            }
+            else -> {
+                result?.notImplemented()
+            }
+        }
+    }
+
+    private fun setUri(uri: String, callback: (Throwable?) -> Unit) {
+        try {
+            ijkPlayer.setOnPreparedListener {
+                callback(null)
+            }
+            ijkPlayer.dataSource = uri
+            ijkPlayer.prepareAsync()
+        } catch (e: Exception) {
+            e.printStackTrace()
+            callback(e)
+        }
+    }
+
+    fun dispose() {
+        mediaPlayer.stop()
+        mediaPlayer.release()
+        textureEntry.release()
+    }
+
+    private fun play() {
+        try {
+            mediaPlayer.start()
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+    private fun pause() {
+        mediaPlayer.pause()
+    }
+
+    private fun stop() {
+        mediaPlayer.stop()
+    }
+
+    fun seekTo(msec: Long) {
+        mediaPlayer.seekTo(msec)
+    }
+
+    fun getDuration(): Long {
+        return mediaPlayer.duration
+    }
+
+}
+

+ 4 - 4
android/src/main/java/com/example/ijkplayer/IjkManager.kt

@@ -7,15 +7,15 @@ import io.flutter.plugin.common.PluginRegistry
 import java.util.*
 import java.util.*
 
 
 class IjkManager(private val registrar: PluginRegistry.Registrar) {
 class IjkManager(private val registrar: PluginRegistry.Registrar) {
-    private val ijkList = ArrayList<IJK>()
+    private val ijkList = ArrayList<Ijk>()
 
 
-    fun create(): IJK {
-        val ijk = IJK(registrar)
+    fun create(): Ijk {
+        val ijk = Ijk(registrar)
         ijkList.add(ijk)
         ijkList.add(ijk)
         return ijk
         return ijk
     }
     }
 
 
-    fun findIJK(id: Long): IJK? {
+    fun findIJK(id: Long): Ijk? {
         return ijkList.find { it.id == id }
         return ijkList.find { it.id == id }
     }
     }
 
 

+ 3 - 38
android/src/main/java/com/example/ijkplayer/IjkplayerPlugin.kt

@@ -11,15 +11,6 @@ import io.flutter.plugin.common.PluginRegistry.Registrar
  */
  */
 class IjkplayerPlugin(private val registrar: Registrar) : MethodCallHandler {
 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) {
     override fun onMethodCall(call: MethodCall, result: Result) {
         handleMethodCall(call, result)
         handleMethodCall(call, result)
@@ -35,35 +26,7 @@ class IjkplayerPlugin(private val registrar: Registrar) : MethodCallHandler {
                     result.error("1", "创建失败", e)
                     result.error("1", "创建失败", e)
                 }
                 }
             }
             }
-            "dispose" -> {
-                val id = call.getLongArg()
-                manager.dispose(id)
-            }
-            "setDataSource" -> {
-                val id = call.argument<Int>("id")!!
-                val uri = call.argument<String>("uri")!!
-                manager.findIJK(id.toLong())?.setUri(uri) { throwable ->
-                    if (throwable == null) {
-                        result.success(throwable)
-                    } else {
-                        throwable.printStackTrace()
-                        result.error("2", "加载失败", throwable)
-                    }
-                }
-            }
-            "play" -> {
-                val id = call.arguments<Int>()
-                manager.findIJK(id.toLong())?.play()
-                result.success(1)
-            }
-            "pause" -> {
-                val id = call.arguments<Int>()
-                manager.findIJK(id.toLong())?.pause()
-            }
-            "stop" -> {
-                val id = call.arguments<Int>()
-                manager.findIJK(id.toLong())?.stop()
-            }
+
             else -> result.notImplemented()
             else -> result.notImplemented()
         }
         }
     }
     }
@@ -77,6 +40,7 @@ class IjkplayerPlugin(private val registrar: Registrar) : MethodCallHandler {
     }
     }
 
 
     companion object {
     companion object {
+        lateinit var manager: IjkManager
 
 
         /**
         /**
          * Plugin registration.
          * Plugin registration.
@@ -85,6 +49,7 @@ class IjkplayerPlugin(private val registrar: Registrar) : MethodCallHandler {
         fun registerWith(registrar: Registrar) {
         fun registerWith(registrar: Registrar) {
             val channel = MethodChannel(registrar.messenger(), "top.kikt/ijkplayer")
             val channel = MethodChannel(registrar.messenger(), "top.kikt/ijkplayer")
             channel.setMethodCallHandler(IjkplayerPlugin(registrar))
             channel.setMethodCallHandler(IjkplayerPlugin(registrar))
+            manager = IjkManager(registrar)
         }
         }
     }
     }
 }
 }

+ 2 - 2
example/lib/main.dart

@@ -67,8 +67,8 @@ class HomePageState extends State<HomePage> {
         child: Icon(Icons.play_arrow),
         child: Icon(Icons.play_arrow),
         onPressed: () async {
         onPressed: () async {
           await controller.setDataSource(
           await controller.setDataSource(
-            'https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4',
-            // 'rtmp://localhost:1935/live1',
+            // 'https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4',
+            'rtmp://172.16.100.245/live1',
             // 'https://www.sample-videos.com/video123/flv/720/big_buck_bunny_720p_10mb.flv',
             // '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',
             // 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/playlist.m3u8',
             // "file:///sdcard/Download/Sample1.mp4",
             // "file:///sdcard/Download/Sample1.mp4",

+ 30 - 22
lib/src/controller.dart

@@ -5,12 +5,15 @@ class IjkMediaController extends ChangeNotifier {
   /// textureId
   /// textureId
   int textureId;
   int textureId;
 
 
+  _IjkPlugin _plugin;
+
   bool get isInit => textureId == null;
   bool get isInit => textureId == null;
 
 
   Future _initIjk() async {
   Future _initIjk() async {
     try {
     try {
-      var id = await _IjkPlugin.createIjk();
+      var id = await createIjk();
       this.textureId = id;
       this.textureId = id;
+      _plugin = _IjkPlugin(id);
     } catch (e) {
     } catch (e) {
       print(e);
       print(e);
       print("初始化失败");
       print("初始化失败");
@@ -18,54 +21,59 @@ class IjkMediaController extends ChangeNotifier {
   }
   }
 
 
   void dispose() {
   void dispose() {
-    var id = textureId;
     this.textureId = null;
     this.textureId = null;
     this.notifyListeners();
     this.notifyListeners();
+    _plugin?.dispose();
     super.dispose();
     super.dispose();
-    _IjkPlugin.dispose(id);
   }
   }
 
 
   Future setDataSource(String url) async {
   Future setDataSource(String url) async {
     if (this.textureId != null) {
     if (this.textureId != null) {
-      await _IjkPlugin.dispose(this.textureId);
+      await _plugin?.dispose();
     }
     }
     await _initIjk();
     await _initIjk();
-    await _IjkPlugin.setDataSource(id: this.textureId, uri: url);
+    await _plugin?.setDataSource(uri: url);
     this.notifyListeners();
     this.notifyListeners();
   }
   }
 
 
   Future play() async {
   Future play() async {
-    await _IjkPlugin.play(this.textureId);
+    await _plugin?.play();
     this.notifyListeners();
     this.notifyListeners();
   }
   }
 }
 }
 
 
+const MethodChannel _globalChannel = MethodChannel("top.kikt/ijkplayer");
+
+Future<int> createIjk() async {
+  int id = await _globalChannel.invokeMethod("create");
+  return id;
+}
+
 class _IjkPlugin {
 class _IjkPlugin {
-  static MethodChannel channel = MethodChannel("top.kikt/ijkplayer");
+  MethodChannel get channel => MethodChannel("top.kikt/ijkplayer/$textureId");
 
 
-  static Future<int> createIjk() async {
-    int id = await channel.invokeMethod("create");
-    return id;
-  }
+  int textureId;
 
 
-  static Future dispose(int id) async {
-    channel.invokeMethod("dispose", id);
+  _IjkPlugin(this.textureId);
+
+  Future dispose() async {
+    channel.invokeMethod("dispose");
   }
   }
 
 
-  static Future play(int id) async {
-    await channel.invokeMethod("play", id);
+  Future play() async {
+    await channel.invokeMethod("play");
   }
   }
 
 
-  static Future pause(int id) async {
-    channel.invokeMethod("pause", id);
+  Future pause() async {
+    channel.invokeMethod("pause");
   }
   }
 
 
-  static Future stop(int id) async {
-    channel.invokeMethod("stop", id);
+  Future stop() async {
+    channel.invokeMethod("stop");
   }
   }
 
 
-  static Future setDataSource({int id, String uri}) async {
-    print("id = $id , uri = $uri");
-    channel.invokeMethod("setDataSource", {"id": id, "uri": uri});
+  Future setDataSource({String uri}) async {
+    print("id = $textureId uri = $uri");
+    channel.invokeMethod("setDataSource", {"uri": uri});
   }
   }
 }
 }

+ 2 - 1
lib/src/ijkplayer.dart

@@ -35,7 +35,8 @@ class _IjkPlayerState extends State<IjkPlayer> {
   @override
   @override
   void dispose() {
   void dispose() {
     controller?.removeListener(updateTextureId);
     controller?.removeListener(updateTextureId);
-    _streamController.close();
+    _streamController?.close();
+    controller?.dispose();
     super.dispose();
     super.dispose();
   }
   }