11import 'dart:io' ;
2+ import 'dart:developer' ;
23import 'package:get/get.dart' ;
3- import 'package:flutter/material .dart' ;
4+ import 'package:rxdart/rxdart .dart' ;
45import 'unified_player_interface.dart' ;
56import 'package:media_kit/media_kit.dart' ;
7+ import 'package:pure_live/common/index.dart' ;
68import 'package:pure_live/player/player_consts.dart' ;
79import 'package:media_kit_video/media_kit_video.dart' ;
8- import 'package:flutter_smart_dialog/flutter_smart_dialog.dart' ;
9- import 'package:pure_live/common/services/settings_service.dart' ;
1010
1111class MediaKitPlayerAdapter implements UnifiedPlayer {
1212 late Player _player;
1313 late VideoController _controller;
1414 final SettingsService settings = Get .find <SettingsService >();
15+
16+ // 👇 使用 BehaviorSubject 缓存状态(与 FijkPlayerAdapter 一致)
17+ final _playingSubject = BehaviorSubject <bool >.seeded (false );
18+ final _errorSubject = BehaviorSubject <String ?>.seeded (null );
19+ final _loadingSubject = BehaviorSubject <bool >.seeded (false );
20+ final _widthSubject = BehaviorSubject <int ?>.seeded (null );
21+ final _heightSubject = BehaviorSubject <int ?>.seeded (null );
22+ final _completeSubject = BehaviorSubject <bool >.seeded (false );
23+
1524 bool _isPlaying = false ;
25+ bool isInitialized = false ;
26+
1627 @override
1728 Future <void > init () async {
1829 _isPlaying = false ;
30+ isInitialized = false ;
31+
1932 _player = Player ();
2033
2134 var pp = _player.platform as NativePlayer ;
2235 if (Platform .isAndroid) {
2336 await pp.setProperty ('force-seekable' , 'yes' );
24- } else if (Platform .isWindows) {
25- await pp.setProperty ('cache' , 'no' );
26- await pp.setProperty ('cache-secs' , '0' );
27- await pp.setProperty ('cache-size' , '0' );
28- await pp.setProperty ('demuxer-seekable-cache' , 'no' );
29- await pp.setProperty ('demuxer-max-back-bytes' , '0' ); // --demuxer-max-back-bytes=<bytesize>
30- await pp.setProperty ('demuxer-donate-buffer' , 'no' ); // --demuxer-donate-buffer==<yes|no>
3137 }
38+
3239 _controller = settings.playerCompatMode.value
3340 ? VideoController (
3441 _player,
@@ -41,8 +48,49 @@ class MediaKitPlayerAdapter implements UnifiedPlayer {
4148 androidAttachSurfaceAfterVideoParameters: false ,
4249 ),
4350 );
51+
52+ // 👇 监听 media_kit 原生流,并同步到 BehaviorSubject
4453 _player.stream.playing.listen ((playing) {
4554 _isPlaying = playing;
55+ if (_playingSubject.value != playing) {
56+ _playingSubject.add (playing);
57+ }
58+
59+ if (! isInitialized) {
60+ isInitialized = true ;
61+ _player.setVolume (100 );
62+ }
63+ });
64+
65+ _player.stream.error.listen ((error) {
66+ final msg = 'MediaKitPlayer error: $error ' ;
67+ SmartDialog .showToast (msg);
68+ _errorSubject.add (msg);
69+ });
70+
71+ _player.stream.completed.listen ((isComplete) {
72+ if (isComplete) {
73+ log ('MediakitPlayer: The Video is completed' );
74+ _completeSubject.add (true );
75+ }
76+ });
77+
78+ _player.stream.buffering.listen ((buffering) {
79+ if (_loadingSubject.value != buffering) {
80+ _loadingSubject.add (buffering);
81+ }
82+ });
83+
84+ _player.stream.width.listen ((w) {
85+ if (_widthSubject.value != w) {
86+ _widthSubject.add (w);
87+ }
88+ });
89+
90+ _player.stream.height.listen ((h) {
91+ if (_heightSubject.value != h) {
92+ _heightSubject.add (h);
93+ }
4694 });
4795 _player.stream.error.listen ((error) {
4896 SmartDialog .showToast ("MediaKit error: $error " , displayTime: Duration (seconds: 5 ));
@@ -75,32 +123,42 @@ class MediaKitPlayerAdapter implements UnifiedPlayer {
75123
76124 @override
77125 void dispose () {
126+ // 👇 先关闭所有 subject
127+ _playingSubject.close ();
128+ _errorSubject.close ();
129+ _loadingSubject.close ();
130+ _widthSubject.close ();
131+ _heightSubject.close ();
132+ _completeSubject.close ();
133+
78134 try {
79135 _player.dispose ();
80136 } catch (e) {
81137 debugPrint (e.toString ());
82138 }
83139 }
84140
141+ // 👇 统一返回缓存流
85142 @override
86- Stream <bool > get onPlaying => _player .stream.playing ;
143+ Stream <bool > get onPlaying => _playingSubject .stream;
87144
88145 @override
89- Stream <String ?> get onError => _player.stream.error.map ((e) => e);
146+ Stream <String ?> get onError => _errorSubject.stream;
147+
90148 @override
91- Stream <bool > get onLoading => _player .stream.buffering ;
149+ Stream <bool > get onLoading => _loadingSubject .stream;
92150
93151 @override
94152 bool get isPlayingNow => _isPlaying;
95153
96154 @override
97- Stream <int ?> get height => _player .stream.height ;
155+ Stream <int ?> get width => _widthSubject .stream;
98156
99157 @override
100- Stream <int ?> get width => _player .stream.width ;
158+ Stream <int ?> get height => _heightSubject .stream;
101159
102160 @override
103- Stream <double ? > get volume => _player .stream.volume ;
161+ Stream <bool > get onComplete => _completeSubject .stream;
104162
105163 @override
106164 Future <void > setVolume (double value) async {
0 commit comments