controller.dart 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. part of './ijkplayer.dart';
  2. /// Media Controller
  3. class IjkMediaController {
  4. int _textureId;
  5. int get textureId => _textureId;
  6. set textureId(int id) {
  7. _textureId = id;
  8. _textureIdController.add(id);
  9. }
  10. StreamController<int> _textureIdController = StreamController.broadcast();
  11. Stream<int> get textureIdStream => _textureIdController.stream;
  12. _IjkPlugin _plugin;
  13. bool get isInit => textureId == null;
  14. IJKEventChannel eventChannel;
  15. bool _isPlaying = false;
  16. bool get isPlaying => _isPlaying == true;
  17. set isPlaying(bool value) {
  18. this._isPlaying = value;
  19. _playingController.add(value);
  20. }
  21. StreamController<bool> _playingController = StreamController.broadcast();
  22. Stream<bool> get playingStream => _playingController.stream;
  23. StreamController<VideoInfo> _videoInfoController =
  24. StreamController.broadcast();
  25. Stream<VideoInfo> get videoInfoStream => _videoInfoController.stream;
  26. Future<void> _initIjk() async {
  27. try {
  28. var id = await _createIjk();
  29. this.textureId = id;
  30. _plugin = _IjkPlugin(id);
  31. eventChannel = IJKEventChannel(this);
  32. await eventChannel.init();
  33. } catch (e) {
  34. print(e);
  35. print("初始化失败");
  36. }
  37. }
  38. void dispose() async {
  39. await reset();
  40. _playingController.close();
  41. _videoInfoController.close();
  42. _textureIdController.close();
  43. }
  44. Future<void> reset() async {
  45. this.textureId = null;
  46. _plugin?.dispose();
  47. _plugin = null;
  48. eventChannel?.dispose();
  49. eventChannel = null;
  50. }
  51. Future<void> setNetworkDataSource(
  52. String url, {
  53. bool autoPlay = false,
  54. }) async {
  55. await _initDataSource(() async {
  56. await _plugin?.setNetworkDataSource(uri: url);
  57. }, autoPlay);
  58. }
  59. Future<void> setAssetDataSource(
  60. String name, {
  61. String package,
  62. bool autoPlay = false,
  63. }) async {
  64. await _initDataSource(() async {
  65. await _plugin?.setAssetDataSource(name, package);
  66. }, autoPlay);
  67. }
  68. Future<void> setFileDataSource(
  69. File file, {
  70. bool autoPlay = false,
  71. }) async {
  72. await _initDataSource(() async {
  73. await _plugin?.setFileDataSource(file.absolute.path);
  74. }, autoPlay);
  75. }
  76. Future<void> _initDataSource(
  77. Future setDataSource(),
  78. bool autoPlay,
  79. ) async {
  80. autoPlay ??= false;
  81. if (this.textureId != null) {
  82. await _plugin?.dispose();
  83. }
  84. await _initIjk();
  85. _autoPlay(autoPlay);
  86. await setDataSource();
  87. }
  88. Future<void> playOrPause() async {
  89. var videoInfo = await getVideoInfo();
  90. var playing = videoInfo.isPlaying;
  91. if (playing) {
  92. await _plugin?.pause();
  93. } else {
  94. await _plugin?.play();
  95. }
  96. refreshVideoInfo();
  97. }
  98. Future<void> play() async {
  99. await _plugin?.play();
  100. refreshVideoInfo();
  101. }
  102. Future<void> pause() async {
  103. await _plugin?.pause();
  104. refreshVideoInfo();
  105. }
  106. Future<void> seekTo(double target) async {
  107. await _plugin?.seekTo(target);
  108. refreshVideoInfo();
  109. }
  110. Future<VideoInfo> getVideoInfo() async {
  111. Map<String, dynamic> result = await _plugin?.getInfo();
  112. var info = VideoInfo.fromMap(result);
  113. return info;
  114. }
  115. Future<void> refreshVideoInfo() async {
  116. var info = await getVideoInfo();
  117. isPlaying = info.isPlaying;
  118. _videoInfoController.add(info);
  119. }
  120. void _autoPlay(bool autoPlay) {
  121. if (autoPlay) {
  122. eventChannel.autoPlay(this);
  123. }
  124. }
  125. Future<void> stop() async {
  126. // await _plugin?.stop();
  127. // refreshVideoInfo();
  128. await _plugin.pause();
  129. await _plugin.seekTo(0);
  130. refreshVideoInfo();
  131. }
  132. }
  133. /// about channel
  134. const MethodChannel _globalChannel = MethodChannel("top.kikt/ijkplayer");
  135. Future<int> _createIjk() async {
  136. int id = await _globalChannel.invokeMethod("create");
  137. return id;
  138. }
  139. class _IjkPlugin {
  140. MethodChannel get channel => MethodChannel("top.kikt/ijkplayer/$textureId");
  141. int textureId;
  142. _IjkPlugin(this.textureId);
  143. Future<void> dispose() async {
  144. await _globalChannel.invokeMethod("dispose", {"id": textureId});
  145. }
  146. Future<void> play() async {
  147. await channel.invokeMethod("play");
  148. }
  149. Future<void> pause() async {
  150. await channel.invokeMethod("pause");
  151. }
  152. Future<void> stop() async {
  153. await channel.invokeMethod("stop");
  154. }
  155. Future<void> setNetworkDataSource({String uri}) async {
  156. print("id = $textureId net uri = $uri");
  157. await channel.invokeMethod("setNetworkDataSource", {"uri": uri});
  158. }
  159. Future<void> setAssetDataSource(String name, String package) async {
  160. print("id = $textureId asset name = $name package = $package");
  161. var params = <String, dynamic>{
  162. "name": name,
  163. };
  164. if (package != null) {
  165. params["package"] = package;
  166. }
  167. await channel.invokeMethod("setAssetDataSource", params);
  168. }
  169. Future<void> setFileDataSource(String path) async {
  170. if (!File(path).existsSync()) {
  171. return Error.fileNotExists;
  172. }
  173. await channel.invokeMethod("setFileDataSource", <String, dynamic>{
  174. "path": path,
  175. });
  176. print("id = $textureId file path = $path");
  177. }
  178. Future<Map<String, dynamic>> getInfo() async {
  179. var map = await channel.invokeMethod("getInfo");
  180. if (map == null) {
  181. return null;
  182. } else {
  183. return map.cast<String, dynamic>();
  184. }
  185. }
  186. Future<void> seekTo(double target) async {
  187. await channel.invokeMethod("seekTo", <String, dynamic>{
  188. "target": target,
  189. });
  190. }
  191. }