Quellcode durchsuchen

add screen stream plugin

x1ongzhu vor 6 Jahren
Ursprung
Commit
f4ace94061

+ 3 - 1
android/app/build.gradle

@@ -34,7 +34,7 @@ android {
     defaultConfig {
         // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
         applicationId "com.izouma.mobilecybergames"
-        minSdkVersion 16
+        minSdkVersion 18
         targetSdkVersion 27
         versionCode flutterVersionCode.toInteger()
         versionName flutterVersionName
@@ -55,6 +55,8 @@ flutter {
 }
 
 dependencies {
+    implementation fileTree(dir: 'libs', include: ['*.jar'])
+    implementation fileTree(dir: 'libs', include: ['*.aar'])
     testImplementation 'junit:junit:4.12'
     androidTestImplementation 'com.android.support.test:runner:1.0.2'
     androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

BIN
android/app/libs/AlivcCore.jar


BIN
android/app/libs/AlivcReporter.aar


BIN
android/app/libs/live-face-beauty-3.3.7.aar


BIN
android/app/libs/live-pusher-3.3.7.aar


+ 10 - 5
android/app/src/main/java/com/izouma/mobilecybergames/MainActivity.java

@@ -1,13 +1,18 @@
 package com.izouma.mobilecybergames;
 
 import android.os.Bundle;
+
+import com.mr.flutter.plugin.filepicker.FilePickerPlugin;
+
 import io.flutter.app.FlutterActivity;
+import io.flutter.plugin.common.MethodChannel;
 import io.flutter.plugins.GeneratedPluginRegistrant;
 
 public class MainActivity extends FlutterActivity {
-  @Override
-  protected void onCreate(Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
-    GeneratedPluginRegistrant.registerWith(this);
-  }
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        GeneratedPluginRegistrant.registerWith(this);
+        ScreenStreamPlugin.registerWith(registrarFor("com.izouma.mobilecybergames.ScreenStreamPlugin"));
+    }
 }

+ 179 - 3
android/app/src/main/java/com/izouma/mobilecybergames/ScreenStreamPlugin.java

@@ -1,19 +1,195 @@
 package com.izouma.mobilecybergames;
 
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.media.projection.MediaProjectionManager;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.Toast;
+
+import com.alivc.live.pusher.AlivcAudioAACProfileEnum;
+import com.alivc.live.pusher.AlivcFpsEnum;
+import com.alivc.live.pusher.AlivcLivePushConfig;
+import com.alivc.live.pusher.AlivcLivePushInfoListener;
+import com.alivc.live.pusher.AlivcLivePusher;
+import com.alivc.live.pusher.AlivcPreviewOrientationEnum;
+import com.alivc.live.pusher.AlivcResolutionEnum;
+
+import java.util.regex.Pattern;
+
 import io.flutter.plugin.common.MethodCall;
 import io.flutter.plugin.common.MethodChannel;
+import io.flutter.plugin.common.PluginRegistry;
+
+public class ScreenStreamPlugin implements MethodChannel.MethodCallHandler, PluginRegistry.ActivityResultListener {
+    public static final int CAPTURE_PERMISSION_REQUEST_CODE = 0x1123;
+
+    private final PluginRegistry.Registrar registrar;
+
+    private AlivcLivePushConfig  mAlivcLivePushConfig;
+    private AlivcLivePusher      mAlivcLivePusher = null;
+    private boolean              started          = false;
+    private String               url;
+    private MethodChannel.Result result;
+
+    public static void registerWith(PluginRegistry.Registrar registrar) {
+        final MethodChannel channel = new MethodChannel(registrar.messenger(), "screen_stream");
+        MethodChannel.MethodCallHandler methodCallHandler = new ScreenStreamPlugin(registrar);
+        registrar.addActivityResultListener((PluginRegistry.ActivityResultListener) methodCallHandler);
+        channel.setMethodCallHandler(methodCallHandler);
+    }
+
+    public ScreenStreamPlugin(PluginRegistry.Registrar registrar) {
+        this.registrar = registrar;
+        AlivcLivePushConfig.setMediaProjectionPermissionResultData(null);
+        mAlivcLivePushConfig = new AlivcLivePushConfig();//初始化推流配置类
+        mAlivcLivePushConfig.setResolution(AlivcResolutionEnum.RESOLUTION_720P);//分辨率540P,最大支持720P
+        mAlivcLivePushConfig.setFps(AlivcFpsEnum.FPS_10); //建议用户使用20fps
+        mAlivcLivePushConfig.setEnableBitrateControl(true); // 打开码率自适应,默认为true
+        mAlivcLivePushConfig.setPreviewOrientation(AlivcPreviewOrientationEnum.ORIENTATION_LANDSCAPE_HOME_RIGHT); // 默认为竖屏,可设置home键向左或向右横屏。
+        mAlivcLivePushConfig.setAudioProfile(AlivcAudioAACProfileEnum.AAC_LC);//设置音频编码模式
+        mAlivcLivePushConfig.setEnableBitrateControl(true);// 打开码率自适应,默认为true
+    }
 
-public class ScreenStreamPlugin implements MethodChannel.MethodCallHandler {
     @Override
     public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
-
+        if ("start".equals(methodCall.method)) {
+            url = methodCall.argument("url");
+            if (!TextUtils.isEmpty(url)) {
+                if (Pattern.matches("^(?i)rtmp:\\\\/\\\\/", url)) {
+                    if (!start()) {
+                        result.error("start fail", "need android 5.0", null);
+                    }
+                    return;
+                }
+            }
+            result.error("wrong url", url, null);
+        } else if ("stop".equals(methodCall.method)) {
+            stop();
+            result.success("success");
+        }
     }
 
-    public boolean start(String url) {
+    public boolean start() {
+        if (started) {
+            mAlivcLivePusher.stopPush();
+            return true;
+        } else {
+            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
+                MediaProjectionManager mediaProjectionManager = (MediaProjectionManager) registrar.activeContext().getSystemService(Context.MEDIA_PROJECTION_SERVICE);
+                registrar.activity().startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), CAPTURE_PERMISSION_REQUEST_CODE);
+                return true;
+            }
+        }
         return false;
     }
 
     public boolean stop() {
         return true;
     }
+
+    public void startPushWithoutSurface() {
+        mAlivcLivePusher = new AlivcLivePusher();
+        try {
+            mAlivcLivePusher.init(registrar.context(), mAlivcLivePushConfig);
+        } catch (IllegalArgumentException e) {
+            e.printStackTrace();
+        } catch (IllegalStateException e) {
+            e.printStackTrace();
+        }
+
+        mAlivcLivePusher.setLivePushInfoListener(new AlivcLivePushInfoListener() {
+            @Override
+            public void onPreviewStarted(AlivcLivePusher pusher) {
+
+            }
+
+            @Override
+            public void onPreviewStoped(AlivcLivePusher pusher) {
+
+            }
+
+            @Override
+            public void onPushStarted(AlivcLivePusher pusher) {
+                started = true;
+            }
+
+            @Override
+            public void onFirstAVFramePushed(AlivcLivePusher alivcLivePusher) {
+
+            }
+
+            @Override
+            public void onPushPauesed(AlivcLivePusher pusher) {
+
+            }
+
+            @Override
+            public void onPushResumed(AlivcLivePusher pusher) {
+
+            }
+
+            @Override
+            public void onPushStoped(AlivcLivePusher pusher) {
+                started = false;
+                mAlivcLivePusher = null;
+            }
+
+            @Override
+            public void onPushRestarted(AlivcLivePusher pusher) {
+
+            }
+
+            @Override
+            public void onFirstFramePreviewed(AlivcLivePusher pusher) {
+
+            }
+
+            @Override
+            public void onDropFrame(AlivcLivePusher pusher, int countBef, int countAft) {
+
+            }
+
+            @Override
+            public void onAdjustBitRate(AlivcLivePusher pusher, int curBr, int targetBr) {
+
+            }
+
+            @Override
+            public void onAdjustFps(AlivcLivePusher pusher, int curFps, int targetFps) {
+
+            }
+
+        });
+
+        mAlivcLivePusher.startPreview(null);
+        mAlivcLivePusher.startPush(url);
+        mAlivcLivePusher.setCaptureVolume(50);
+    }
+
+    @Override
+    public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
+        switch (requestCode) {
+            case CAPTURE_PERMISSION_REQUEST_CODE: {
+                if (resultCode == Activity.RESULT_OK) {
+                    AlivcLivePushConfig.setMediaProjectionPermissionResultData(data);
+                    if (mAlivcLivePushConfig.getMediaProjectionPermissionResultData() != null) {
+                        if (mAlivcLivePusher == null) {
+                            startPushWithoutSurface();
+                            if (result != null) {
+                                result.success("success");
+                                return true;
+                            }
+                        }
+                    }
+                }
+                if (result != null) {
+                    result.error("needs permission", "permission not granted", null);
+                }
+            }
+            break;
+        }
+        return false;
+    }
 }

+ 0 - 89
lib/gridview_demo.dart

@@ -1,89 +0,0 @@
-import 'package:flutter/material.dart';
-
-import 'package:http/http.dart' as http;
-import 'dart:convert';
-import 'dart:async';
-
-class MyHomePage extends StatefulWidget {
-  @override
-  _MyHomePageState createState() => _MyHomePageState();
-}
-
-class _MyHomePageState extends State<MyHomePage> {
-  ScrollController _controller;
-  List<String> images;
-
-  @override
-  void initState() {
-    super.initState();
-    images = List();
-    _controller = ScrollController();
-    fetchTen();
-    _controller.addListener(() {
-      if (_controller.position.pixels == _controller.position.maxScrollExtent) {
-        fetchTen();
-      }
-    });
-  }
-
-  @override
-  void dispose() {
-    super.dispose();
-    _controller.dispose();
-  }
-
-  @override
-  Widget build(BuildContext context) {
-    return Scaffold(
-      appBar: AppBar(
-        title: Text('pull to loading demo'),
-      ),
-      body: RefreshIndicator(
-        onRefresh: () async {
-          await new Future.delayed(const Duration(seconds: 1));
-          images.clear();
-          fetchTen();
-        },
-        child: GridView.builder(
-          gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
-              crossAxisCount: 2,
-              mainAxisSpacing: 10.0,
-              crossAxisSpacing: 10.0,
-              childAspectRatio: 1.0),
-          controller: _controller,
-          itemCount: images.length,
-          itemBuilder: (BuildContext context, int index){
-            return _buildItem(images[index]);
-          },
-        ),
-      ),
-    );
-  }
-
-  Widget _buildItem(String url){
-    return Container(
-      constraints: BoxConstraints.tightFor(height: 150.0),
-      child: Image.network(
-        url,
-        fit: BoxFit.cover,
-      ),
-    );
-  }
-
-  fetch() async {
-    final response = await http.get('http://dog.ceo/api/breeds/image/random');
-    if (response.statusCode == 200) {
-      setState(() {
-        images.add(json.decode(response.body)['message'],);
-      });
-    } else {
-      throw Exception('Failed to load images');
-    }
-  }
-
-  fetchTen() {
-    for (int i = 0; i < 10; i++) {
-      fetch();
-    }
-  }
-}

+ 1 - 1
lib/main.dart

@@ -26,7 +26,7 @@ class MobileCyberGamesApp extends StatelessWidget {
               backgroundColor: Color(0xFF222335),
               primaryColor: Color(0xFFC2524D),
               buttonColor: Color(0xFFC2524D),
-              highlightColor: Color(0xFF933E3E),
+//              highlightColor: Color(0xFF933E3E),
               accentColor: Color(0xFFC2524D),
               textSelectionColor: Colors.white,
               textTheme: TextTheme(

+ 14 - 0
lib/plugins/ScreenStramPlugin.dart

@@ -0,0 +1,14 @@
+import 'package:flutter/services.dart';
+
+class ScreenStreamPlugin {
+  static const _channel = MethodChannel("screen_stram");
+
+  static Future<bool> start(String url) async {
+    try {
+      await _channel.invokeMethod("start", [url]);
+      return true;
+    } catch (e) {
+      return false;
+    }
+  }
+}

+ 0 - 21
lib/state.dart

@@ -1,21 +0,0 @@
-import 'package:meta/meta.dart';
-import 'dart:async';
-import 'package:shared_preferences/shared_preferences.dart';
-
-enum Actions { updateToken,updateUser,updateAll}
-
-@immutable
-class CountState {
-  String usetoken;
-  Map userInfo;
-  get _usetoken => usetoken;
-  get _userInfo => userInfo;
-
-  CountState(this.usetoken);
-  CountState.initState(){
-    usetoken = '';
-    userInfo={};
-  }
-
-  
-}