From f43ee200e42d4bb5db531bca5cab38e3bac09bc6 Mon Sep 17 00:00:00 2001 From: Xiang Fan Date: Thu, 18 Oct 2018 09:37:49 +0800 Subject: [PATCH 1/2] video_player: Add speed adjustment support for Android --- .../videoplayer/VideoPlayerPlugin.java | 13 +++++++++ .../ios/Classes/VideoPlayerPlugin.m | 3 ++ packages/video_player/lib/video_player.dart | 29 ++++++++++++++++++- 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java b/packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java index 2b730214068d..59c915e2731c 100644 --- a/packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java +++ b/packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java @@ -15,6 +15,7 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayerFactory; +import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player.DefaultEventListener; import com.google.android.exoplayer2.SimpleExoPlayer; @@ -207,6 +208,14 @@ void setVolume(double value) { exoPlayer.setVolume(bracketedValue); } + void setSpeed(double value) { + if (value <= 0.0) return; + PlaybackParameters parameters = exoPlayer.getPlaybackParameters(); + PlaybackParameters newParameters = + new PlaybackParameters((float) value, parameters.pitch, parameters.skipSilence); + exoPlayer.setPlaybackParameters(newParameters); + } + void seekTo(int location) { exoPlayer.seekTo(location); } @@ -356,6 +365,10 @@ private void onMethodCall(MethodCall call, Result result, long textureId, VideoP player.setVolume((Double) call.argument("volume")); result.success(null); break; + case "setSpeed": + player.setSpeed((Double) call.argument("speed")); + result.success(null); + break; case "play": player.play(); result.success(null); diff --git a/packages/video_player/ios/Classes/VideoPlayerPlugin.m b/packages/video_player/ios/Classes/VideoPlayerPlugin.m index aeec622ce7b6..8424176476bd 100644 --- a/packages/video_player/ios/Classes/VideoPlayerPlugin.m +++ b/packages/video_player/ios/Classes/VideoPlayerPlugin.m @@ -368,6 +368,9 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { } else if ([@"setVolume" isEqualToString:call.method]) { [player setVolume:[[argsMap objectForKey:@"volume"] doubleValue]]; result(nil); + } else if ([@"setSpeed" isEqualToString:call.method]) { + // TODO: Implement setSpeed + result(nil); } else if ([@"play" isEqualToString:call.method]) { [player play]; result(nil); diff --git a/packages/video_player/lib/video_player.dart b/packages/video_player/lib/video_player.dart index c297078bf8f9..724ef2481e7a 100644 --- a/packages/video_player/lib/video_player.dart +++ b/packages/video_player/lib/video_player.dart @@ -44,6 +44,7 @@ class VideoPlayerValue { this.isLooping = false, this.isBuffering = false, this.volume = 1.0, + this.speed = 1.0, this.errorDescription, }); @@ -75,6 +76,9 @@ class VideoPlayerValue { /// The current volume of the playback. final double volume; + /// The current speed of the playback. + final double speed; + /// A description of the error if present. /// /// If [hasError] is false this is [null]. @@ -98,6 +102,7 @@ class VideoPlayerValue { bool isLooping, bool isBuffering, double volume, + double speed, String errorDescription, }) { return VideoPlayerValue( @@ -109,6 +114,7 @@ class VideoPlayerValue { isLooping: isLooping ?? this.isLooping, isBuffering: isBuffering ?? this.isBuffering, volume: volume ?? this.volume, + speed: speed ?? this.speed, errorDescription: errorDescription ?? this.errorDescription, ); } @@ -122,8 +128,9 @@ class VideoPlayerValue { 'buffered: [${buffered.join(', ')}], ' 'isPlaying: $isPlaying, ' 'isLooping: $isLooping, ' - 'isBuffering: $isBuffering' + 'isBuffering: $isBuffering, ' 'volume: $volume, ' + 'speed: $speed, ' 'errorDescription: $errorDescription)'; } } @@ -233,6 +240,7 @@ class VideoPlayerController extends ValueNotifier { initializingCompleter.complete(null); _applyLooping(); _applyVolume(); + _applySpeed(); _applyPlayPause(); break; case 'completed': @@ -355,6 +363,16 @@ class VideoPlayerController extends ValueNotifier { ); } + Future _applySpeed() async { + if (!value.initialized || _isDisposed) { + return; + } + await _channel.invokeMethod( + 'setSpeed', + {'textureId': _textureId, 'speed': value.speed}, + ); + } + /// The position in the current video. Future get position async { if (_isDisposed) { @@ -392,6 +410,15 @@ class VideoPlayerController extends ValueNotifier { value = value.copyWith(volume: volume.clamp(0.0, 1.0)); await _applyVolume(); } + + /// Sets the playback speed of [this]. + /// + /// [speed] must be greater than zero. + Future setSpeed(double speed) async { + if (speed <= 0.0) return; + value = value.copyWith(speed: speed); + await _applySpeed(); + } } class _VideoAppLifeCycleObserver extends Object with WidgetsBindingObserver { From bf1a68e730c0f01b0edf30928b3f2700921ff9dc Mon Sep 17 00:00:00 2001 From: Xiang Fan Date: Thu, 18 Oct 2018 10:32:35 +0800 Subject: [PATCH 2/2] video_player_test: Implement setSpeed --- packages/video_player/test/video_player_test.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/video_player/test/video_player_test.dart b/packages/video_player/test/video_player_test.dart index 22dd9a2e3e67..fc978418ccd6 100644 --- a/packages/video_player/test/video_player_test.dart +++ b/packages/video_player/test/video_player_test.dart @@ -30,6 +30,8 @@ class FakeController extends ValueNotifier @override Future setVolume(double volume) async {} @override + Future setSpeed(double speed) async {} + @override Future initialize() async {} @override Future pause() async {}