Quick implementation of progress tracking
This commit is contained in:
parent
353c6bd4e3
commit
0977c6b29b
31
RCTVideo.m
31
RCTVideo.m
@ -10,17 +10,47 @@
|
|||||||
AVPlayer *_player;
|
AVPlayer *_player;
|
||||||
AVPlayerLayer *_playerLayer;
|
AVPlayerLayer *_playerLayer;
|
||||||
NSURL *_videoURL;
|
NSURL *_videoURL;
|
||||||
|
|
||||||
|
/* Required to publish events */
|
||||||
RCTEventDispatcher *_eventDispatcher;
|
RCTEventDispatcher *_eventDispatcher;
|
||||||
|
|
||||||
|
/* For sending videoProgress events */
|
||||||
|
id _progressUpdateTimer;
|
||||||
|
int _progressUpdateInterval;
|
||||||
|
NSDate *_prevProgressUpdateTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher
|
- (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher
|
||||||
{
|
{
|
||||||
if ((self = [super init])) {
|
if ((self = [super init])) {
|
||||||
_eventDispatcher = eventDispatcher;
|
_eventDispatcher = eventDispatcher;
|
||||||
|
|
||||||
|
/* Initialize videoProgress status publisher */
|
||||||
|
_progressUpdateInterval = 1;
|
||||||
|
_prevProgressUpdateTime = nil;
|
||||||
|
_progressUpdateTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(sendProgressUpdate)];
|
||||||
|
[_progressUpdateTimer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)sendProgressUpdate
|
||||||
|
{
|
||||||
|
AVPlayerItem *video = [_player currentItem];
|
||||||
|
if (video == nil) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_prevProgressUpdateTime == nil ||
|
||||||
|
((int) [[NSDate date] timeIntervalSinceDate: _prevProgressUpdateTime]) >= _progressUpdateInterval) {
|
||||||
|
[_eventDispatcher sendInputEventWithName:@"videoProgress" body:@{
|
||||||
|
@"currentTime": [NSNumber numberWithFloat:CMTimeGetSeconds(video.currentTime)],
|
||||||
|
@"target": self.reactTag
|
||||||
|
}];
|
||||||
|
_prevProgressUpdateTime = [NSDate date];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void)setSrc:(NSString *)source
|
- (void)setSrc:(NSString *)source
|
||||||
{
|
{
|
||||||
_videoURL = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:source ofType:@"mp4"]];
|
_videoURL = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:source ofType:@"mp4"]];
|
||||||
@ -110,6 +140,7 @@
|
|||||||
|
|
||||||
- (void)dealloc
|
- (void)dealloc
|
||||||
{
|
{
|
||||||
|
[_progressUpdateTimer invalidate];
|
||||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
return [[RCTVideo alloc] initWithEventDispatcher:self.bridge.eventDispatcher];
|
return [[RCTVideo alloc] initWithEventDispatcher:self.bridge.eventDispatcher];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* onLoadStart, onLoad, and onError to stay consistent with Image */
|
/* Should support: onLoadStart, onLoad, and onError to stay consistent with Image */
|
||||||
|
|
||||||
- (NSDictionary *)customDirectEventTypes
|
- (NSDictionary *)customDirectEventTypes
|
||||||
{
|
{
|
||||||
@ -20,6 +20,9 @@
|
|||||||
@"videoLoaded": @{
|
@"videoLoaded": @{
|
||||||
@"registrationName": @"onLoad"
|
@"registrationName": @"onLoad"
|
||||||
},
|
},
|
||||||
|
@"videoProgress": @{
|
||||||
|
@"registrationName": @"onProgress"
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ var Video = React.createClass({
|
|||||||
repeat: PropTypes.bool,
|
repeat: PropTypes.bool,
|
||||||
pause: PropTypes.bool,
|
pause: PropTypes.bool,
|
||||||
onLoad: PropTypes.func,
|
onLoad: PropTypes.func,
|
||||||
|
onProgress: PropTypes.func,
|
||||||
},
|
},
|
||||||
|
|
||||||
mixins: [NativeMethodsMixin],
|
mixins: [NativeMethodsMixin],
|
||||||
@ -32,6 +33,10 @@ var Video = React.createClass({
|
|||||||
this.props.onLoad && this.props.onLoad(event.nativeEvent);
|
this.props.onLoad && this.props.onLoad(event.nativeEvent);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_onProgress(event) {
|
||||||
|
this.props.onProgress && this.props.onProgress(event.nativeEvent);
|
||||||
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
var style = flattenStyle([styles.base, this.props.style]);
|
var style = flattenStyle([styles.base, this.props.style]);
|
||||||
var source = this.props.source;
|
var source = this.props.source;
|
||||||
@ -52,6 +57,7 @@ var Video = React.createClass({
|
|||||||
resizeMode: resizeMode,
|
resizeMode: resizeMode,
|
||||||
src: source,
|
src: source,
|
||||||
onLoad: this._onLoad,
|
onLoad: this._onLoad,
|
||||||
|
onProgress: this._onProgress,
|
||||||
});
|
});
|
||||||
|
|
||||||
return <RCTVideo {... nativeProps} />
|
return <RCTVideo {... nativeProps} />
|
||||||
|
Loading…
Reference in New Issue
Block a user