cjl_macbook пре 6 година
родитељ
комит
c355a28b65

+ 14 - 9
android/src/main/java/top/kikt/ijkplayer/Ijk.kt

@@ -3,14 +3,15 @@ package top.kikt.ijkplayer
 /// create 2019/3/7 by cai
 
 
+import android.graphics.Bitmap
 import android.util.Base64
-import android.view.TextureView
 import io.flutter.plugin.common.MethodCall
 import io.flutter.plugin.common.MethodChannel
 import io.flutter.plugin.common.PluginRegistry
 import top.kikt.ijkplayer.entity.Info
 import tv.danmaku.ijk.media.player.IjkMediaPlayer
 import tv.danmaku.ijk.media.player.TextureMediaPlayer
+import java.io.ByteArrayOutputStream
 import java.io.File
 
 class Ijk(private val registry: PluginRegistry.Registrar) : MethodChannel.MethodCallHandler {
@@ -112,12 +113,11 @@ class Ijk(private val registry: PluginRegistry.Registrar) : MethodChannel.Method
                 result?.success(true)
             }
             "getVolume" -> {
-
 //                result?.success(this.mediaPlayer.setVolume())
             }
             "screenShot" -> {
-                screenShot()
-                result?.success(byteArrayOf())
+                val bytes = screenShot()
+                result?.success(bytes)
             }
             else -> {
                 result?.notImplemented()
@@ -125,11 +125,16 @@ class Ijk(private val registry: PluginRegistry.Registrar) : MethodChannel.Method
         }
     }
 
-    private fun screenShot() {
-        val textureView = TextureView(registry.activity())
-        textureView.surfaceTexture = textureEntry.surfaceTexture()
-        val bitmap = textureView.bitmap
-        logi("bitmap width = ${bitmap?.width} height = ${bitmap?.height}")
+    private fun screenShot(): ByteArray? {
+        val frameBitmap = mediaPlayer.frameBitmap
+        return if (frameBitmap != null) {
+            val outputStream = ByteArrayOutputStream()
+            frameBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
+            frameBitmap.recycle()
+            outputStream.toByteArray()
+        } else {
+            null
+        }
     }
 
     fun getInfo(): Info {

+ 3 - 0
android/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java

@@ -43,6 +43,8 @@ import android.util.Log;
 import android.view.Surface;
 import android.view.SurfaceHolder;
 
+import org.jetbrains.annotations.Nullable;
+
 import java.io.FileDescriptor;
 import java.io.FileNotFoundException;
 import java.io.IOException;
@@ -506,6 +508,7 @@ public final class IjkMediaPlayer extends AbstractMediaPlayer {
     private native void _setAndroidIOCallback(IAndroidIO androidIO)
             throws IllegalArgumentException, SecurityException, IllegalStateException;
 
+    @Nullable
     public native Bitmap getFrameBitmap();
     // public native int getFrameBitmap();
 

+ 0 - 3
example/lib/page/screen_shot_page.dart

@@ -51,9 +51,6 @@ class _ScreenShotPageState extends State<ScreenShotPage> {
               var uint8List = await mediaController.screenShot();
               provider = MemoryImage(uint8List);
               setState(() {});
-
-              var size = await getImageForUint8List(uint8List);
-              print("width = ${size.width} , height = ${size.height}");
             },
           ),
           provider == null

+ 4 - 0
lib/src/controller.dart

@@ -346,6 +346,10 @@ class IjkMediaController with IjkMediaControllerMixin {
     refreshVideoInfo();
     _playFinishController?.add(this);
   }
+
+  Future<Uint8List> screenShot(){
+    return _plugin.screenShot();
+  }
 }
 
 /// about channel

+ 0 - 2
lib/src/ijkplayer.dart

@@ -142,13 +142,11 @@ class __IjkPlayerWrapperState extends State<_IjkPlayerWrapper> {
   void initState() {
     super.initState();
     widget.controller?.attach(widget.globalKey);
-    print("wrapper state init ");
   }
 
   @override
   void dispose() {
     widget.controller?.detach(widget.globalKey);
-    print("wrapper state dispose");
     super.dispose();
   }
 

+ 0 - 18
lib/src/ijkplayer_controller_mixin.dart

@@ -1,7 +1,4 @@
-import 'dart:typed_data';
-import 'dart:ui' as ui;
 import 'package:flutter/material.dart';
-import 'package:flutter/rendering.dart';
 
 mixin IjkMediaControllerMixin {
   List<GlobalKey> _keys = [];
@@ -15,19 +12,4 @@ mixin IjkMediaControllerMixin {
     print("IjkMediaControllerMixin detach $key");
     _keys.remove(key);
   }
-
-  Future<Uint8List> screenShot() async {
-    print("IjkMediaControllerMixin will screen shot");
-    if (_keys.isEmpty) {
-      print("IjkMediaControllerMixin screen shot key is empty = $_keys");
-      return null;
-    }
-    var key = _keys[0];
-    RenderRepaintBoundary boundary = key.currentContext.findRenderObject();
-    var image = await boundary.toImage();
-    print(
-        "IjkMediaControllerMixin screen shot image width = ${image.width} , height = ${image.height}");
-    var byteData = await image.toByteData(format: ui.ImageByteFormat.png);
-    return byteData.buffer.asUint8List();
-  }
 }