diff --git a/packages/video_player/example/lib/main.dart b/packages/video_player/example/lib/main.dart index 320df27c8e3e..9e3fdb2a3e8b 100644 --- a/packages/video_player/example/lib/main.dart +++ b/packages/video_player/example/lib/main.dart @@ -390,7 +390,8 @@ void main() { Container( padding: const EdgeInsets.all(20), child: NetworkPlayerLifeCycle( - 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/playlist.m3u8', + 'https://cbsnewshd-lh.akamaihd.net/i/CBSNHD_7@199302/master.m3u8', + // 'http://184.72.239.149/vod/smil:BigBuckBunny.smil/playlist.m3u8', (BuildContext context, VideoPlayerController controller) => AspectRatioVideo(controller), diff --git a/packages/video_player/ios/Classes/VideoPlayerPlugin.m b/packages/video_player/ios/Classes/VideoPlayerPlugin.m index 4aea59f34e8b..d12bf49e49bc 100644 --- a/packages/video_player/ios/Classes/VideoPlayerPlugin.m +++ b/packages/video_player/ios/Classes/VideoPlayerPlugin.m @@ -335,6 +335,17 @@ - (int64_t)position { } - (int64_t)duration { + if(CMTIME_IS_INDEFINITE([[_player currentItem] duration])) { + int64_t maxBuffering = 0; + for (NSValue* rangeValue in [_player currentItem].loadedTimeRanges) { + CMTimeRange range = [rangeValue CMTimeRangeValue]; + int64_t start = FLTCMTimeToMillis(range.start); + if (start > maxBuffering) { + maxBuffering = start + FLTCMTimeToMillis(range.duration); + } + } + return maxBuffering; + } return FLTCMTimeToMillis([[_player currentItem] duration]); } @@ -498,6 +509,8 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { result(nil); } else if ([@"position" isEqualToString:call.method]) { result(@([player position])); + } else if ([@"duration" isEqualToString:call.method]) { + result(@([player duration])); } else if ([@"seekTo" isEqualToString:call.method]) { [player seekTo:[argsMap[@"location"] intValue]]; result(nil); diff --git a/packages/video_player/lib/video_player.dart b/packages/video_player/lib/video_player.dart index fb42096d9709..417e22cc4065 100644 --- a/packages/video_player/lib/video_player.dart +++ b/packages/video_player/lib/video_player.dart @@ -331,10 +331,11 @@ class VideoPlayerController extends ValueNotifier { return; } final Duration newPosition = await position; + final Duration newDuration = await duration; if (_isDisposed) { return; } - value = value.copyWith(position: newPosition); + value = value.copyWith(position: newPosition, duration: newDuration); }, ); } else { @@ -369,6 +370,19 @@ class VideoPlayerController extends ValueNotifier { ); } + /// The duration in the current video. + Future get duration async { + if (_isDisposed) { + return null; + } + return Duration( + milliseconds: await _channel.invokeMethod( + 'duration', + {'textureId': _textureId}, + ), + ); + } + Future seekTo(Duration moment) async { if (_isDisposed) { return;