Caijinglong 6 lat temu
rodzic
commit
2c434656a8

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

@@ -1,5 +1,3 @@
-import 'dart:ui' as ui;
-
 import 'package:flutter/material.dart';
 import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
 import 'package:ijkplayer_example/i18n/i18n.dart';

+ 30 - 0
lib/src/controller.dart

@@ -53,6 +53,9 @@ class IjkMediaController with IjkMediaControllerMixin {
   set isPlaying(bool value) {
     this._isPlaying = value;
     _playingController?.add(value);
+    if (value == true) {
+      _ijkStatus = IjkStatus.playing;
+    }
   }
 
   /// playing state stream controller
@@ -105,6 +108,22 @@ class IjkMediaController with IjkMediaControllerMixin {
   Stream<IjkMediaController> get playFinishStream =>
       _playFinishController.stream;
 
+  IjkStatus __ijkStatus = IjkStatus.noDataSource;
+
+  IjkStatus get ijkStatus => __ijkStatus;
+
+  set _ijkStatus(IjkStatus status) {
+    __ijkStatus = status;
+    _ijkStatusController?.add(status);
+  }
+
+  /// playFinish
+  StreamController<IjkStatus> _ijkStatusController =
+      StreamController.broadcast();
+
+  /// On play finish
+  Stream<IjkStatus> get ijkStatusStream => _ijkStatusController.stream;
+
   /// create ijk texture id from native
   Future<void> _initIjk() async {
     try {
@@ -128,12 +147,14 @@ class IjkMediaController with IjkMediaControllerMixin {
     _textureIdController?.close();
     _volumeController?.close();
     _playFinishController?.close();
+    _ijkStatusController?.close();
 
     _playingController = null;
     _videoInfoController = null;
     _textureIdController = null;
     _volumeController = null;
     _playFinishController = null;
+    _ijkStatusController = null;
 
     IjkMediaPlayerManager().remove(this);
   }
@@ -154,11 +175,13 @@ class IjkMediaController with IjkMediaControllerMixin {
     Map<String, String> headers = const {},
     bool autoPlay = false,
   }) async {
+    _ijkStatus = IjkStatus.preparing;
     await _initDataSource(() async {
       await _plugin?.setNetworkDataSource(
         uri: url,
         headers: headers,
       );
+      _ijkStatus = IjkStatus.prepared;
     }, autoPlay);
   }
 
@@ -168,8 +191,10 @@ class IjkMediaController with IjkMediaControllerMixin {
     String package,
     bool autoPlay = false,
   }) async {
+    _ijkStatus = IjkStatus.preparing;
     await _initDataSource(() async {
       await _plugin?.setAssetDataSource(name, package);
+      _ijkStatus = IjkStatus.prepared;
     }, autoPlay);
   }
 
@@ -208,8 +233,10 @@ class IjkMediaController with IjkMediaControllerMixin {
     File file, {
     bool autoPlay = false,
   }) async {
+    _ijkStatus = IjkStatus.preparing;
     await _initDataSource(() async {
       await _plugin?.setFileDataSource(file.absolute.path);
+      _ijkStatus = IjkStatus.prepared;
     }, autoPlay);
   }
 
@@ -252,6 +279,7 @@ class IjkMediaController with IjkMediaControllerMixin {
     LogUtils.info("$this play");
     await _plugin?.play();
     refreshVideoInfo();
+    _ijkStatus = IjkStatus.playing;
   }
 
   /// pause media
@@ -259,6 +287,7 @@ class IjkMediaController with IjkMediaControllerMixin {
     LogUtils.info("$this pause");
     await _plugin?.pause();
     refreshVideoInfo();
+    _ijkStatus = IjkStatus.pause;
   }
 
   /// seek to second
@@ -346,6 +375,7 @@ class IjkMediaController with IjkMediaControllerMixin {
     isPlaying = videoInfo.isPlaying;
     refreshVideoInfo();
     _playFinishController?.add(this);
+    _ijkStatus = IjkStatus.complete;
   }
 
   /// Intercept the video frame image and get the `Uint8List` format.

+ 13 - 0
lib/src/ijkplayer.dart

@@ -5,6 +5,7 @@ import 'dart:typed_data';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter_ijkplayer/src/ijkplayer_controller_mixin.dart';
+import 'package:flutter_ijkplayer/src/widget/state_builder.dart';
 
 import 'error.dart';
 import 'package:flutter_ijkplayer/src/helper/logutil.dart';
@@ -17,6 +18,8 @@ part 'controller.dart';
 part 'ijk_event_channel.dart';
 part 'engine/manager.dart';
 
+typedef Widget IjkStateWidgetBuilder(IjkMediaController controller);
+
 /// Main Classes of Library
 class IjkPlayer extends StatefulWidget {
   final IjkMediaController mediaController;
@@ -27,12 +30,15 @@ class IjkPlayer extends StatefulWidget {
   /// See [buildDefaultIjkPlayer]
   final IJKTextureBuilder textureBuilder;
 
+  final IjkStateWidgetBuilder stateWidgetBuilder;
+
   /// Main Classes of Library
   const IjkPlayer({
     Key key,
     @required this.mediaController,
     this.controllerWidgetBuilder = defaultBuildIjkControllerWidget,
     this.textureBuilder = buildDefaultIjkPlayer,
+    this.stateWidgetBuilder = defaultBuildStateWidget,
   }) : super(key: key);
 
   @override
@@ -44,6 +50,9 @@ class IjkPlayerState extends State<IjkPlayer> {
   /// see [IjkMediaController]
   IjkMediaController controller;
   GlobalKey _wrapperKey = GlobalKey();
+
+  IjkStateWidgetBuilder get _ijkStateBuilder => widget.stateWidgetBuilder;
+
   @override
   void initState() {
     super.initState();
@@ -119,6 +128,10 @@ class IjkPlayerState extends State<IjkPlayer> {
       ),
     );
   }
+
+  Widget buildIjkStateWidget() {
+    return _ijkStateBuilder?.call(controller) ?? Container();
+  }
 }
 
 class _IjkPlayerWrapper extends StatefulWidget {

+ 26 - 0
lib/src/widget/state_builder.dart

@@ -0,0 +1,26 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
+
+Widget defaultBuildStateWidget(IjkMediaController controller) {
+  return IjkStateWidget(controller);
+}
+
+class IjkStateWidget extends StatelessWidget {
+  final IjkMediaController controller;
+
+  const IjkStateWidget(this.controller);
+
+  @override
+  Widget build(BuildContext context) {
+    return Container();
+  }
+}
+
+enum IjkStatus {
+  noDataSource,
+  preparing,
+  prepared,
+  pause,
+  playing,
+  complete,
+}