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 474d7b269d..e5d56729e9 100644 --- a/Video.js +++ b/Video.js @@ -382,6 +382,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 98cb0737e0..ecfc4b884b 100644 --- a/ios/Video/RCTVideo.m +++ b/ios/Video/RCTVideo.m @@ -54,6 +54,7 @@ @implementation RCTVideo float _rate; float _maxBitRate; + BOOL _automaticallyWaitsToMinimizeStalling; BOOL _muted; BOOL _paused; BOOL _repeat; @@ -87,7 +88,7 @@ - (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher { if ((self = [super init])) { _eventDispatcher = eventDispatcher; - + _automaticallyWaitsToMinimizeStalling = YES; _playbackRateObserverRegistered = NO; _isExternalPlaybackActiveObserverRegistered = NO; _playbackStalled = NO; @@ -376,6 +377,9 @@ - (void)setSrc:(NSDictionary *)source _isExternalPlaybackActiveObserverRegistered = YES; [self addPlayerTimeObserver]; + if (@available(iOS 10.0, *)) { + [self setAutomaticallyWaitsToMinimizeStalling:_automaticallyWaitsToMinimizeStalling]; + } //Perform on next run loop, otherwise onVideoLoadStart is nil if (self.onVideoLoadStart) { @@ -864,7 +868,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]; } @@ -951,6 +961,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 1614eab168..7233646f37 100644 --- a/ios/Video/RCTVideoManager.m +++ b/ios/Video/RCTVideoManager.m @@ -22,6 +22,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);