Browse Source

Add controller stream usage example

cjl_macbook 6 years ago
parent
commit
9639a25294

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

@@ -50,4 +50,10 @@ class _I18nZh extends I18n {
 
   @override
   String get pick => "选择";
+
+  @override
+  String get useStreamUsage => "Controller stream的使用";
+
+  @override
+  String get playFinishToast => "播放完毕";
 }

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

@@ -49,4 +49,10 @@ class _I18nEn extends I18n {
 
   @override
   String get pick => "pick";
+
+  @override
+  String get useStreamUsage => "Controller stream usage";
+
+  @override
+  String get playFinishToast => "Play video finish";
 }

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

@@ -36,6 +36,10 @@ abstract class I18n {
   String get pick;
 
   String get noPickTip;
+
+  String get useStreamUsage;
+
+  String get playFinishToast;
 }
 
 I18n get currentI18n => I18n(window.locale);

+ 196 - 0
example/lib/page/controller_stream_use.dart

@@ -0,0 +1,196 @@
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+
+import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
+import 'package:ijkplayer_example/i18n/i18n.dart';
+import 'package:oktoast/oktoast.dart';
+
+class ControllerStreamUsagePage extends StatefulWidget {
+  @override
+  _ControllerStreamUsagePageState createState() =>
+      _ControllerStreamUsagePageState();
+}
+
+class _ControllerStreamUsagePageState extends State<ControllerStreamUsagePage> {
+  IjkMediaController controller = IjkMediaController();
+
+  @override
+  void initState() {
+    super.initState();
+    controller.setDataSource(
+      DataSource.asset("assets/sample1.mp4"),
+      autoPlay: true,
+    );
+    subscriptPlayFinish();
+  }
+
+  @override
+  void dispose() {
+    subscription?.cancel();
+    controller?.dispose();
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: Text(currentI18n.useStreamUsage),
+      ),
+      body: ListView(
+        children: <Widget>[
+          AspectRatio(
+            aspectRatio: 1280 / 720,
+            child: IjkPlayer(
+              mediaController: controller,
+              controllerWidgetBuilder: (ctl) {
+                return DefaultIJKControllerWidget(
+                  controller: ctl,
+                  volumeType: VolumeType.media,
+                );
+              },
+            ),
+          ),
+          Container(
+            child: Row(
+              children: <Widget>[
+                Expanded(
+                  child: buildAudioVolume(),
+                ),
+                Expanded(
+                  child: Container(
+                    decoration: BoxDecoration(
+                      border: Border(left: _borderSlider)
+                    ),
+                    child: buildVideoInfo(),
+                  ),
+                ),
+              ],
+            ),
+            decoration: decoration,
+          ),
+          buildTextureId(),
+        ],
+      ),
+    );
+  }
+
+  Widget buildAudioVolume() {
+    return Container(
+      child: StreamBuilder<int>(
+        builder: (BuildContext context, snapshot) {
+          return buildText("volume: ${snapshot.data}");
+        },
+        stream: controller.volumeStream,
+        initialData: controller.volume,
+      ),
+    );
+  }
+
+  Widget buildVideoInfo() {
+    return StreamBuilder<VideoInfo>(
+      builder: (BuildContext context, snapshot) {
+        if (!snapshot.hasData || !snapshot.data.hasData) {
+          return buildText("videoInfo: null");
+        }
+        return buildInfo(snapshot.data);
+      },
+      stream: controller.videoInfoStream,
+      initialData: controller.videoInfo,
+    );
+  }
+
+  buildInfo(VideoInfo info) {
+    return Container(
+      padding: const EdgeInsets.all(8.0),
+      child: Column(
+        children: <Widget>[
+          buildInfoText("width", info.width.toString()),
+          buildInfoText("height", info.height.toString()),
+          buildInfoText("degree", info.degree.toString()),
+          buildInfoText("currentPosition", info.currentPosition.toString()),
+          buildInfoText("totalDuration", info.duration.toString()),
+          buildInfoText("tcp speed", info.tcpSpeed.toString()),
+          buildInfoText("isPlaying", info.isPlaying.toString()),
+        ],
+      ),
+    );
+  }
+
+  StreamSubscription subscription;
+
+  subscriptPlayFinish() {
+    subscription = controller.playFinishStream.listen((data) {
+      showToast(currentI18n.playFinishToast);
+    });
+  }
+
+  buildTextureId() {
+    var stream = StreamBuilder<int>(
+      builder: (BuildContext context, snapshot) {
+        return buildText("texture id = ${snapshot.data}");
+      },
+      initialData: controller.textureId,
+      stream: controller.textureIdStream,
+    );
+    return Column(
+      children: <Widget>[
+        buildButton("change data source", changeId),
+        stream,
+      ],
+    );
+  }
+
+  changeId() {
+    controller.setDataSource(
+        DataSource.network(
+          "http://img.ksbbs.com/asset/Mon_1703/05cacb4e02f9d9e.mp4",
+        ),
+        autoPlay: true);
+  }
+}
+
+Widget buildInfoText(String title, String text) {
+  return Container(
+    height: 20.0,
+    alignment: Alignment.center,
+    child: Text(
+      "$title : $text",
+      textAlign: TextAlign.center,
+    ),
+  );
+}
+
+Widget buildText(String text) {
+  return Container(
+    height: 60.0,
+    alignment: Alignment.center,
+    child: Text(
+      text,
+      textAlign: TextAlign.center,
+    ),
+  );
+}
+
+Widget buildButton(String text, Function function) {
+  return OutlineButton(
+    child: Text(text),
+    onPressed: function,
+  );
+}
+
+const decoration = BoxDecoration(
+  border: Border(
+    top: _borderSlider,
+    bottom: _borderSlider,
+    left: _borderSlider,
+    right: _borderSlider,
+  ),
+);
+
+const _borderSlider = BorderSide(
+  color: Colors.grey,
+  style: BorderStyle.solid,
+  width: 1,
+);

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

@@ -1,6 +1,7 @@
 import 'package:flutter/material.dart';
 import 'package:ijkplayer_example/i18n/i18n.dart';
 import 'package:ijkplayer_example/page/asset_page.dart';
+import 'package:ijkplayer_example/page/controller_stream_use.dart';
 import 'package:ijkplayer_example/page/dialog_video_page.dart';
 import 'package:ijkplayer_example/page/full_screen.dart';
 import 'package:ijkplayer_example/page/gallery_page.dart';
@@ -30,6 +31,7 @@ class _IndexPageState extends State<IndexPage> {
           buildButton(currentI18n.fullScreenManualButton, FullScreen2()),
           buildButton(currentI18n.withDialogButton, DialogVideoPage()),
           buildButton(currentI18n.pageViewButton, PagingPickPage()),
+          buildButton(currentI18n.useStreamUsage, ControllerStreamUsagePage()),
         ],
       ),
     );

+ 1 - 1
lib/flutter_ijkplayer.dart

@@ -2,5 +2,5 @@ export 'src/error.dart';
 export 'src/ijkplayer.dart';
 export 'package:flutter_ijkplayer/src/entity/video_info.dart';
 export 'src/widget/controller_widget_builder.dart'
-    show DefaultIJKControllerWidget;
+    show DefaultIJKControllerWidget,VolumeType;
 export 'package:flutter_ijkplayer/src/helper/config.dart';

+ 4 - 4
lib/src/controller.dart

@@ -68,10 +68,10 @@ class IjkMediaController {
   /// video info stream
   Stream<VideoInfo> get videoInfoStream => _videoInfoController?.stream;
 
-  VideoInfo _info = VideoInfo.fromMap(null);
+  VideoInfo _videoInfo = VideoInfo.fromMap(null);
 
   /// last update video info.
-  VideoInfo get info => _info;
+  VideoInfo get videoInfo => _videoInfo;
 
   /// video volume stream controller
   StreamController<int> _volumeController = StreamController.broadcast();
@@ -287,7 +287,7 @@ class IjkMediaController {
   /// request info and notify
   Future<void> refreshVideoInfo() async {
     var info = await getVideoInfo();
-    _info = info;
+    _videoInfo = info;
     isPlaying = info.isPlaying;
     if (info.hasData) {
       _videoInfoController?.add(info);
@@ -342,7 +342,7 @@ class IjkMediaController {
   }
 
   void _onPlayFinish() {
-    isPlaying = info.isPlaying;
+    isPlaying = videoInfo.isPlaying;
     refreshVideoInfo();
     _playFinishController?.add(this);
   }

+ 1 - 1
lib/src/ijkplayer.dart

@@ -70,7 +70,7 @@ class IjkPlayerState extends State<IjkPlayer> {
         var id = snapshot.data;
         return StreamBuilder<VideoInfo>(
             stream: controller.videoInfoStream,
-            initialData: controller.info,
+            initialData: controller.videoInfo,
             builder: (context, videoInfoSnapShot) {
               return _buildTexture(id, videoInfoSnapShot.data);
             });

+ 0 - 1
lib/src/widget/controller_widget_builder.dart

@@ -175,7 +175,6 @@ class _DefaultIJKControllerWidgetState extends State<DefaultIJKControllerWidget>
       color: Colors.white,
       icon: Icon(isFull ? Icons.fullscreen_exit : Icons.fullscreen),
       onPressed: () {
-        // todo: 这里加入控制全屏和取消全屏的代码, 还需要根据视频宽高决定是竖向全屏还是横向全屏
         if (isFull) {
           Navigator.pop(context);
         } else {