Bläddra i källkod

Support set speed.

Caijinglong 6 år sedan
förälder
incheckning
3babc40145

+ 4 - 0
android/src/main/java/top/kikt/ijkplayer/Ijk.kt

@@ -164,6 +164,10 @@ class Ijk(private val registry: PluginRegistry.Registrar, val options: Map<Strin
                 val bytes = screenShot()
                 result?.success(bytes)
             }
+            "setSpeed" -> {
+                val speed = call.arguments<Double>()
+                mediaPlayer.setSpeed(speed.toFloat())
+            }
             else -> {
                 result?.notImplemented()
             }

+ 3 - 0
example/lib/i18n/cn.dart

@@ -74,4 +74,7 @@ class _I18nZh extends I18n {
 
   @override
   String get customFullScreenWidget => "自定义全屏界面";
+
+  @override
+  String get setSpeed => "播放速度";
 }

+ 3 - 0
example/lib/i18n/en.dart

@@ -74,4 +74,7 @@ class _I18nEn extends I18n {
 
   @override
   String get customFullScreenWidget => "Custom Full Screen Interface";
+
+  @override
+  String get setSpeed => "Set media speed";
 }

+ 2 - 0
example/lib/i18n/i18n.dart

@@ -52,6 +52,8 @@ abstract class I18n {
   String get errorUrl;
 
   String get customFullScreenWidget;
+
+  String get setSpeed;
 }
 
 I18n get currentI18n => I18n(window.locale);

+ 3 - 1
example/lib/page/developing/develop_index.dart

@@ -1,6 +1,7 @@
 import 'package:flutter/material.dart';
 
 import 'develop_prepare_page.dart';
+import 'live_interruption_page.dart';
 
 class DevelopingIndexPage extends StatefulWidget {
   @override
@@ -12,11 +13,12 @@ class DevelopingIndexPageState extends State<DevelopingIndexPage> {
   Widget build(BuildContext context) {
     return Scaffold(
       appBar: AppBar(
-        title: Text("开发中"),
+        title: Text("For Developer , user don't use."),
       ),
       body: ListView(
         children: <Widget>[
           buildButton("developing preare page", ForPreparePage()),
+          buildButton("直播中断", LiveInterruptionPage()),
         ],
       ),
     );

+ 66 - 0
example/lib/page/developing/live_interruption_page.dart

@@ -0,0 +1,66 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
+import 'package:ijkplayer_example/i18n/i18n.dart';
+
+/// 直播异常中断
+class LiveInterruptionPage extends StatefulWidget {
+  @override
+  _LiveInterruptionPageState createState() => _LiveInterruptionPageState();
+}
+
+class _LiveInterruptionPageState extends State<LiveInterruptionPage> {
+  TextEditingController editingController = TextEditingController();
+  IjkMediaController mediaController = IjkMediaController();
+
+  @override
+  void initState() {
+    super.initState();
+
+    editingController.text =
+        "http://js.flv.huya.com/huyalive/94525224-2460685313-10568562945082523648-2789274524-10057-A-0-1.flv?wsSecret=9b67d35535b6956aec37815c21e43cc8&wsTime=5cbbea84&ratio=2000";
+  }
+
+  @override
+  void dispose() {
+    editingController.dispose();
+    mediaController.dispose();
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: Text(currentI18n.networkButton),
+      ),
+      body: ListView(
+        children: <Widget>[
+          Row(
+            children: <Widget>[
+              Expanded(
+                child: TextField(
+                  controller: editingController,
+                ),
+              ),
+              FlatButton(
+                child: Text(currentI18n.play),
+                onPressed: _playInput,
+              ),
+            ],
+          ),
+          Container(
+            height: 400,
+            child: IjkPlayer(
+              mediaController: mediaController,
+            ),
+          ),
+        ],
+      ),
+    );
+  }
+
+  void _playInput() async {
+    var text = editingController.text;
+    await mediaController.setNetworkDataSource(text, autoPlay: true);
+  }
+}

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

@@ -7,7 +7,6 @@ import '../i18n/i18n.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';
@@ -16,6 +15,7 @@ import 'gallery_page.dart';
 import 'ijk_status_page.dart';
 import 'in_overlay_page.dart';
 import 'network.dart';
+import 'speed_page.dart';
 
 class IndexPage extends StatefulWidget {
   @override
@@ -46,6 +46,7 @@ class _IndexPageState extends State<IndexPage> {
           buildButton(currentI18n.ijkStatusTitle, IjkStatusPage()),
           buildButton(currentI18n.customOption, CustomIjkOptionPage()),
           buildButton(currentI18n.errorUrl, ErrorUrlPage()),
+          buildButton(currentI18n.setSpeed, SpeedPage()),
           buildButton(
               currentI18n.customFullScreenWidget, CustomFullControllerPage()),
         ],

+ 64 - 0
example/lib/page/speed_page.dart

@@ -0,0 +1,64 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
+import 'package:ijkplayer_example/i18n/i18n.dart';
+
+class SpeedPage extends StatefulWidget {
+  @override
+  _SpeedPageState createState() => _SpeedPageState();
+}
+
+class _SpeedPageState extends State<SpeedPage> {
+  IjkMediaController controller = IjkMediaController();
+
+  double speed = 1;
+
+  @override
+  void initState() {
+    super.initState();
+    var url = "http://img.ksbbs.com/asset/Mon_1703/05cacb4e02f9d9e.mp4";
+    var dataSource = DataSource.network(url);
+    controller?.setDataSource(dataSource, autoPlay: true);
+  }
+
+  @override
+  void dispose() {
+    controller.dispose();
+    controller = null;
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: Text(currentI18n.setSpeed),
+      ),
+      body: Container(
+        child: ListView(
+          children: <Widget>[
+            Container(
+              height: 280,
+              child: IjkPlayer(
+                mediaController: controller,
+              ),
+            ),
+            Slider(
+              value: speed,
+              max: 2,
+              min: 0.5,
+              divisions: 6,
+              onChanged: _onChangeSpeed,
+            ),
+            Center(child: Text("speed is $speed")),
+          ],
+        ),
+      ),
+    );
+  }
+
+  void _onChangeSpeed(double value) {
+    this.speed = value;
+    setState(() {});
+    controller?.setSpeed(speed);
+  }
+}

+ 6 - 0
ios/Classes/CoolFlutterIJK.m

@@ -108,6 +108,12 @@
             NSData *data = [weakSelf screenShot];
             result(data);
         });
+    } else if ([@"setSpeed" isEqualToString:call.method]) {
+        float speedValue = [call.arguments floatValue];
+        if (controller) {
+            [controller setPlaybackRate:speedValue];
+        }
+        result(@YES);
     } else {
         result(FlutterMethodNotImplemented);
     }

+ 19 - 11
lib/src/controller/controller.dart

@@ -12,11 +12,24 @@ class IjkMediaController
 
   Map<TargetPlatform, Set<IjkOption>> _options = {};
 
+  bool needChangeSpeed;
+
   /// MediaController
   IjkMediaController({
     this.autoRotate = true,
+    this.needChangeSpeed = true,
   }) {
     index = IjkMediaPlayerManager().add(this);
+    if (needChangeSpeed) {
+      setIjkPlayerOptions(
+          [
+            TargetPlatform.iOS,
+            TargetPlatform.android,
+          ],
+          <IjkOption>[
+            IjkOption(IjkOptionCategory.player, "soundtouch", 1),
+          ].toSet());
+    }
   }
 
   @override
@@ -245,15 +258,6 @@ class IjkMediaController
     }
   }
 
-  /// AutoPlay use
-  Future<void> _autoPlay(bool autoPlay) async {
-    if (autoPlay) {
-      await eventChannel?.autoPlay(this);
-    } else {
-      await eventChannel?.disableAutoPlay(this);
-    }
-  }
-
   /// set video volume
   Future<void> _setVolume(int volume) async {
     await _plugin?.setVolume(volume);
@@ -317,10 +321,10 @@ class IjkMediaController
   /// It will only take effect if you call [setDataSource] again.
   void setIjkPlayerOptions(
     List<TargetPlatform> platforms,
-    Set<IjkOption> options,
+    Iterable<IjkOption> options,
   ) {
     for (var platform in platforms) {
-      _options[platform] = options;
+      _options[platform] = options.toSet();
     }
   }
 
@@ -340,4 +344,8 @@ class IjkMediaController
       opts.addAll(options);
     }
   }
+
+  Future<void> setSpeed(double speed) async {
+    await _plugin.setSpeed(speed);
+  }
 }

+ 4 - 0
lib/src/controller/plugin.dart

@@ -108,4 +108,8 @@ class _IjkPlugin {
     }
     return result;
   }
+
+  Future<void> setSpeed(double speed) async {
+    await channel.invokeMethod("setSpeed", speed);
+  }
 }