|
|
@@ -1,133 +1,22 @@
|
|
|
part of '../ijkplayer.dart';
|
|
|
|
|
|
/// Media Controller
|
|
|
-class IjkMediaController with IjkMediaControllerMixin {
|
|
|
- /// MediaController
|
|
|
- IjkMediaController({
|
|
|
- this.autoRotate = true,
|
|
|
- }) {
|
|
|
- index = IjkMediaPlayerManager().add(this);
|
|
|
- }
|
|
|
-
|
|
|
- int index;
|
|
|
-
|
|
|
- String get debugLabel => index.toString();
|
|
|
-
|
|
|
- /// texture id from native
|
|
|
- int _textureId;
|
|
|
-
|
|
|
+class IjkMediaController
|
|
|
+ with IjkMediaControllerMixin, IjkMediaControllerStreamMixin {
|
|
|
/// It will automatically correct the direction of the video.
|
|
|
bool autoRotate;
|
|
|
|
|
|
- /// texture id from native
|
|
|
- int get textureId => _textureId;
|
|
|
-
|
|
|
- /// set texture id, Normally the user does not call
|
|
|
- set textureId(int id) {
|
|
|
- _textureId = id;
|
|
|
- _textureIdController.add(id);
|
|
|
- }
|
|
|
-
|
|
|
- /// on texture id change
|
|
|
- StreamController<int> _textureIdController = StreamController.broadcast();
|
|
|
-
|
|
|
- /// on texture id change
|
|
|
- Stream<int> get textureIdStream => _textureIdController?.stream;
|
|
|
-
|
|
|
- /// Channel of flutter and native.
|
|
|
- _IjkPlugin _plugin;
|
|
|
-
|
|
|
- /// Whether texture id is null
|
|
|
- bool get isInit => textureId == null;
|
|
|
-
|
|
|
- /// channel of native to flutter
|
|
|
- _IJKEventChannel eventChannel;
|
|
|
-
|
|
|
- /// playing state
|
|
|
- bool _isPlaying = false;
|
|
|
-
|
|
|
- /// playing state
|
|
|
- bool get isPlaying => _isPlaying == true;
|
|
|
-
|
|
|
- /// playing state
|
|
|
- set isPlaying(bool value) {
|
|
|
- this._isPlaying = value;
|
|
|
- _playingController?.add(value);
|
|
|
- if (value == true) {
|
|
|
- _ijkStatus = IjkStatus.playing;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /// playing state stream controller
|
|
|
- StreamController<bool> _playingController = StreamController.broadcast();
|
|
|
-
|
|
|
- /// playing state stream
|
|
|
- Stream<bool> get playingStream => _playingController?.stream;
|
|
|
-
|
|
|
- /// video info stream controller
|
|
|
- StreamController<VideoInfo> _videoInfoController =
|
|
|
- StreamController.broadcast();
|
|
|
-
|
|
|
- /// video info stream
|
|
|
- Stream<VideoInfo> get videoInfoStream => _videoInfoController?.stream;
|
|
|
-
|
|
|
- VideoInfo _videoInfo = VideoInfo.fromMap(null);
|
|
|
-
|
|
|
- /// last update video info.
|
|
|
- VideoInfo get videoInfo => _videoInfo;
|
|
|
-
|
|
|
- /// video volume stream controller
|
|
|
- StreamController<int> _volumeController = StreamController.broadcast();
|
|
|
-
|
|
|
- /// video volume stream
|
|
|
- Stream<int> get volumeStream => _volumeController?.stream;
|
|
|
-
|
|
|
- /// video volume, not system volume
|
|
|
- int _volume = 100;
|
|
|
-
|
|
|
- /// video volume, not system volume
|
|
|
- set volume(int value) {
|
|
|
- if (value > 100) {
|
|
|
- value = 100;
|
|
|
- } else if (value < 0) {
|
|
|
- value = 0;
|
|
|
- }
|
|
|
- this._volume = value;
|
|
|
- _volumeController?.add(value);
|
|
|
- _setVolume(value);
|
|
|
- }
|
|
|
-
|
|
|
- /// video volume, not system volume
|
|
|
- int get volume => _volume;
|
|
|
-
|
|
|
- /// playFinish
|
|
|
- StreamController<IjkMediaController> _playFinishController =
|
|
|
- StreamController.broadcast();
|
|
|
-
|
|
|
- /// On play finish
|
|
|
- Stream<IjkMediaController> get playFinishStream =>
|
|
|
- _playFinishController.stream;
|
|
|
-
|
|
|
- IjkStatus __ijkStatus = IjkStatus.noDatasource;
|
|
|
+ int index;
|
|
|
|
|
|
- IjkStatus get ijkStatus => __ijkStatus;
|
|
|
+ String get debugLabel => index.toString();
|
|
|
|
|
|
- set _ijkStatus(IjkStatus status) {
|
|
|
- if (status != __ijkStatus) {
|
|
|
- __ijkStatus = status;
|
|
|
- _ijkStatusController?.add(status);
|
|
|
- } else {
|
|
|
- __ijkStatus = status;
|
|
|
- }
|
|
|
+ /// MediaController
|
|
|
+ IjkMediaController({
|
|
|
+ this.autoRotate = true,
|
|
|
+ }) {
|
|
|
+ index = IjkMediaPlayerManager().add(this);
|
|
|
}
|
|
|
|
|
|
- /// 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 {
|
|
|
@@ -146,20 +35,7 @@ class IjkMediaController with IjkMediaControllerMixin {
|
|
|
/// [reset] and close all controller
|
|
|
void dispose() async {
|
|
|
await reset();
|
|
|
- _ijkStatus = IjkStatus.disposed;
|
|
|
- _playingController?.close();
|
|
|
- _videoInfoController?.close();
|
|
|
- _textureIdController?.close();
|
|
|
- _volumeController?.close();
|
|
|
- _playFinishController?.close();
|
|
|
- _ijkStatusController?.close();
|
|
|
-
|
|
|
- _playingController = null;
|
|
|
- _videoInfoController = null;
|
|
|
- _textureIdController = null;
|
|
|
- _volumeController = null;
|
|
|
- _playFinishController = null;
|
|
|
- _ijkStatusController = null;
|
|
|
+ await _disposeStream();
|
|
|
|
|
|
IjkMediaPlayerManager().remove(this);
|
|
|
}
|
|
|
@@ -392,141 +268,3 @@ class IjkMediaController with IjkMediaControllerMixin {
|
|
|
return _plugin.screenShot();
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-/// about channel
|
|
|
-MethodChannel _globalChannel = MethodChannel("top.kikt/ijkplayer");
|
|
|
-
|
|
|
-Future<int> _createIjk() async {
|
|
|
- int id = await _globalChannel.invokeMethod("create");
|
|
|
- return id;
|
|
|
-}
|
|
|
-
|
|
|
-class _IjkPlugin {
|
|
|
- MethodChannel get channel => MethodChannel("top.kikt/ijkplayer/$textureId");
|
|
|
-
|
|
|
- /// texture id
|
|
|
- int textureId;
|
|
|
-
|
|
|
- _IjkPlugin(this.textureId);
|
|
|
-
|
|
|
- Future<void> dispose() async {
|
|
|
- await _globalChannel.invokeMethod("dispose", {"id": textureId});
|
|
|
- }
|
|
|
-
|
|
|
- Future<void> play() async {
|
|
|
- await channel.invokeMethod("play");
|
|
|
- }
|
|
|
-
|
|
|
- Future<void> pause() async {
|
|
|
- await channel.invokeMethod("pause");
|
|
|
- }
|
|
|
-
|
|
|
- Future<void> stop() async {
|
|
|
- await channel.invokeMethod("stop");
|
|
|
- }
|
|
|
-
|
|
|
- Future<void> setNetworkDataSource(
|
|
|
- {String uri, Map<String, String> headers = const {}}) async {
|
|
|
- LogUtils.debug("id = $textureId net uri = $uri ,headers = $headers");
|
|
|
- await channel.invokeMethod("setNetworkDataSource", <String, dynamic>{
|
|
|
- "uri": uri,
|
|
|
- "headers": headers,
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- Future<void> setAssetDataSource(String name, String package) async {
|
|
|
- LogUtils.debug("id = $textureId asset name = $name package = $package");
|
|
|
- var params = <String, dynamic>{
|
|
|
- "name": name,
|
|
|
- };
|
|
|
- if (package != null) {
|
|
|
- params["package"] = package;
|
|
|
- }
|
|
|
- await channel.invokeMethod("setAssetDataSource", params);
|
|
|
- }
|
|
|
-
|
|
|
- Future<void> setFileDataSource(String path) async {
|
|
|
- if (!File(path).existsSync()) {
|
|
|
- return Error.fileNotExists;
|
|
|
- }
|
|
|
- await channel.invokeMethod("setFileDataSource", <String, dynamic>{
|
|
|
- "path": path,
|
|
|
- });
|
|
|
- LogUtils.debug("id = $textureId file path = $path");
|
|
|
- }
|
|
|
-
|
|
|
- Future<Map<String, dynamic>> getInfo() async {
|
|
|
- var map = await channel.invokeMethod("getInfo");
|
|
|
- if (map == null) {
|
|
|
- return null;
|
|
|
- } else {
|
|
|
- return map.cast<String, dynamic>();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- Future<void> seekTo(double target) async {
|
|
|
- await channel.invokeMethod("seekTo", <String, dynamic>{
|
|
|
- "target": target,
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- ///
|
|
|
- Future<void> setVolume(int volume) async {
|
|
|
- await channel.invokeMethod("setVolume", <String, dynamic>{
|
|
|
- "volume": volume,
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- Future<Uint8List> screenShot() async {
|
|
|
- var result = await channel.invokeMethod("screenShot");
|
|
|
- if (result == null) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- return result;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-/// Entity classe for data sources.
|
|
|
-class DataSource {
|
|
|
- /// See [DataSourceType]
|
|
|
- DataSourceType _type;
|
|
|
-
|
|
|
- File _file;
|
|
|
-
|
|
|
- String _assetName;
|
|
|
-
|
|
|
- String _assetPackage;
|
|
|
-
|
|
|
- String _netWorkUrl;
|
|
|
-
|
|
|
- Map<String, String> _headers;
|
|
|
-
|
|
|
- DataSource._();
|
|
|
-
|
|
|
- /// Create file data source
|
|
|
- factory DataSource.file(File file) {
|
|
|
- var ds = DataSource._();
|
|
|
- ds._file = file;
|
|
|
- ds._type = DataSourceType.file;
|
|
|
- return ds;
|
|
|
- }
|
|
|
-
|
|
|
- /// Create network data source
|
|
|
- factory DataSource.network(String url,
|
|
|
- {Map<String, String> headers = const {}}) {
|
|
|
- var ds = DataSource._();
|
|
|
- ds._netWorkUrl = url;
|
|
|
- ds._headers = headers;
|
|
|
- ds._type = DataSourceType.network;
|
|
|
- return ds;
|
|
|
- }
|
|
|
-
|
|
|
- /// Create asset data source
|
|
|
- factory DataSource.asset(String assetName, {String package}) {
|
|
|
- var ds = DataSource._();
|
|
|
- ds._assetName = assetName;
|
|
|
- ds._assetPackage = package;
|
|
|
- ds._type = DataSourceType.asset;
|
|
|
- return ds;
|
|
|
- }
|
|
|
-}
|