diff --git a/CHANGELOG.md b/CHANGELOG.md index d5b8151055..23c088c95a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ ## Changelog +### next +* Added support for automaticallyWaitsToMinimizeStalling property (iOS) [#1723](https://github.com/react-native-community/react-native-video/pull/1723) + ### Version 5.0.2 * Fix crash when RCTVideo's superclass doesn't observe the keyPath 'frame' (iOS) [#1720](https://github.com/react-native-community/react-native-video/pull/1720) diff --git a/README.md b/README.md index 9be9cc268e..4b0a87546e 100644 --- a/README.md +++ b/README.md @@ -292,6 +292,7 @@ var styles = StyleSheet.create({ ### Configurable props * [allowsExternalPlayback](#allowsexternalplayback) * [audioOnly](#audioonly) +* [automaticallyWaitsToMinimizeStalling](#automaticallyWaitsToMinimizeStalling) * [bufferConfig](#bufferconfig) * [controls](#controls) * [filter](#filter) @@ -370,6 +371,13 @@ For this to work, the poster prop must be set. Platforms: all +#### automaticallyWaitsToMinimizeStalling +A Boolean value that indicates whether the player should automatically delay playback in order to minimize stalling. For clients linked against iOS 10.0 and later +* **false** - Immediately starts playback +* **true (default)** - Delays playback in order to minimize stalling + +Platforms: iOS + #### bufferConfig Adjust the buffer settings. This prop takes an object with one or more of the properties listed below. diff --git a/Video.js b/Video.js index 7dc2ab61f1..f518f4a4c4 100644 --- a/Video.js +++ b/Video.js @@ -428,6 +428,7 @@ Video.propTypes = { poster: PropTypes.string, posterResizeMode: Image.propTypes.resizeMode, repeat: PropTypes.bool, + automaticallyWaitsToMinimizeStalling: PropTypes.bool, allowsExternalPlayback: PropTypes.bool, selectedAudioTrack: PropTypes.shape({ type: PropTypes.string.isRequired, diff --git a/ios/Video/RCTVideo.m b/ios/Video/RCTVideo.m index 8b5cfcacba..39bf7b5f4a 100644 --- a/ios/Video/RCTVideo.m +++ b/ios/Video/RCTVideo.m @@ -67,6 +67,7 @@ @implementation RCTVideo float _rate; float _maxBitRate; + BOOL _automaticallyWaitsToMinimizeStalling; BOOL _muted; BOOL _paused; BOOL _repeat; @@ -106,6 +107,7 @@ - (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher inView = true; // ZEROLABS _separateAudioTrack = YES; // ZEROLABS + _automaticallyWaitsToMinimizeStalling = YES; _playbackRateObserverRegistered = NO; _isExternalPlaybackActiveObserverRegistered = NO; _playbackStalled = NO; @@ -565,6 +567,9 @@ - (void)crankVideo2 { _isExternalPlaybackActiveObserverRegistered = YES; [self addPlayerTimeObserver]; + if (@available(iOS 10.0, *)) { + [self setAutomaticallyWaitsToMinimizeStalling:_automaticallyWaitsToMinimizeStalling]; + } //Perform on next run loop, otherwise onVideoLoadStart is nil if (self.onVideoLoadStart) { @@ -1312,7 +1317,13 @@ - (void)setPaused:(BOOL)paused } else if([_ignoreSilentSwitch isEqualToString:@"obey"]) { [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]; } - [_player play]; + + if (@available(iOS 10.0, *) && !_automaticallyWaitsToMinimizeStalling) { + [_player playImmediatelyAtRate:1.0]; + } else { + [_player play]; + [_player setRate:_rate]; + } [_player setRate:_rate]; } @@ -1399,6 +1410,12 @@ - (void)setMaxBitRate:(float) maxBitRate { _playerItem.preferredPeakBitRate = maxBitRate; } +- (void)setAutomaticallyWaitsToMinimizeStalling:(BOOL)waits +{ + _automaticallyWaitsToMinimizeStalling = waits; + _player.automaticallyWaitsToMinimizeStalling = waits; +} + - (void)applyModifiers { diff --git a/ios/Video/RCTVideoManager.m b/ios/Video/RCTVideoManager.m index 2ddacac86e..1e94ff4c81 100644 --- a/ios/Video/RCTVideoManager.m +++ b/ios/Video/RCTVideoManager.m @@ -29,6 +29,7 @@ - (dispatch_queue_t)methodQueue RCT_EXPORT_VIEW_PROPERTY(maxBitRate, float); RCT_EXPORT_VIEW_PROPERTY(resizeMode, NSString); RCT_EXPORT_VIEW_PROPERTY(repeat, BOOL); +RCT_EXPORT_VIEW_PROPERTY(automaticallyWaitsToMinimizeStalling, BOOL); RCT_EXPORT_VIEW_PROPERTY(allowsExternalPlayback, BOOL); RCT_EXPORT_VIEW_PROPERTY(textTracks, NSArray); RCT_EXPORT_VIEW_PROPERTY(selectedTextTrack, NSDictionary);