[ASVideoNode, ASVideoPlayerNode] Add video composition and audio mix capabilities (#1800)

* [ASVideoNode] Add delegate method called when the currentItem is set.

* [ASVideoNode] Add videoComposition and audioMix properties to the ASVideoNode.

* [ASVideoPlayerNode] Add new initialiser with videoComposition and audioMix, and forward new delegate method.

* [ASVideoPlayerNode] Forward missing ASVideoNodeDelegate methods.
This commit is contained in:
Flo
2016-07-10 20:32:21 +02:00
committed by appleguy
parent 10447998af
commit 2e65339f33
4 changed files with 178 additions and 7 deletions

View File

@@ -37,10 +37,17 @@ static void *ASVideoPlayerNodeContext = &ASVideoPlayerNodeContext;
unsigned int delegateVideoNodeShouldChangeState:1;
unsigned int delegateVideoNodePlaybackDidFinish:1;
unsigned int delegateDidTapVideoPlayerNode:1;
unsigned int delegateVideoPlayerNodeDidSetCurrentItem:1;
unsigned int delegateVideoPlayerNodeDidStallAtTimeInterval:1;
unsigned int delegateVideoPlayerNodeDidStartInitialLoading:1;
unsigned int delegateVideoPlayerNodeDidFinishInitialLoading:1;
unsigned int delegateVideoPlayerNodeDidRecoverFromStall:1;
} _delegateFlags;
NSURL *_url;
AVAsset *_asset;
AVVideoComposition *_videoComposition;
AVAudioMix *_audioMix;
ASVideoNode *_videoNode;
@@ -118,6 +125,22 @@ static void *ASVideoPlayerNodeContext = &ASVideoPlayerNodeContext;
return self;
}
-(instancetype)initWithAsset:(AVAsset *)asset videoComposition:(AVVideoComposition *)videoComposition audioMix:(AVAudioMix *)audioMix
{
if (!(self = [super init])) {
return nil;
}
_asset = asset;
_videoComposition = videoComposition;
_audioMix = audioMix;
_loadAssetWhenNodeBecomesVisible = YES;
[self _init];
return self;
}
- (instancetype)initWithUrl:(NSURL *)url loadAssetWhenNodeBecomesVisible:(BOOL)loadAssetWhenNodeBecomesVisible
{
if (!(self = [super init])) {
@@ -147,6 +170,22 @@ static void *ASVideoPlayerNodeContext = &ASVideoPlayerNodeContext;
return self;
}
-(instancetype)initWithAsset:(AVAsset *)asset videoComposition:(AVVideoComposition *)videoComposition audioMix:(AVAudioMix *)audioMix loadAssetWhenNodeBecomesVisible:(BOOL)loadAssetWhenNodeBecomesVisible
{
if (!(self = [super init])) {
return nil;
}
_asset = asset;
_videoComposition = videoComposition;
_audioMix = audioMix;
_loadAssetWhenNodeBecomesVisible = loadAssetWhenNodeBecomesVisible;
[self _init];
return self;
}
- (void)_init
{
_defaultControlsColor = [UIColor whiteColor];
@@ -156,6 +195,8 @@ static void *ASVideoPlayerNodeContext = &ASVideoPlayerNodeContext;
_videoNode.delegate = self;
if (_loadAssetWhenNodeBecomesVisible == NO) {
_videoNode.asset = _asset;
_videoNode.videoComposition = _videoComposition;
_videoNode.audioMix = _audioMix;
}
[self addSubnode:_videoNode];
}
@@ -175,8 +216,16 @@ static void *ASVideoPlayerNodeContext = &ASVideoPlayerNodeContext;
ASDN::MutexLocker l(_propertyLock);
if (isVisible && _loadAssetWhenNodeBecomesVisible && _asset != _videoNode.asset) {
_videoNode.asset = _asset;
if (isVisible && _loadAssetWhenNodeBecomesVisible) {
if (_asset != _videoNode.asset) {
_videoNode.asset = _asset;
}
if (_videoComposition != _videoNode.videoComposition) {
_videoNode.videoComposition = _videoComposition;
}
if (_audioMix != _videoNode.audioMix) {
_videoNode.audioMix = _audioMix;
}
}
}
@@ -480,6 +529,41 @@ static void *ASVideoPlayerNodeContext = &ASVideoPlayerNodeContext;
}
}
- (void)videoNode:(ASVideoNode *)videoNode didSetCurrentItem:(AVPlayerItem *)currentItem
{
if (_delegateFlags.delegateVideoPlayerNodeDidSetCurrentItem) {
[_delegate videoPlayerNode:self didSetCurrentItem:currentItem];
}
}
- (void)videoNode:(ASVideoNode *)videoNode didStallAtTimeInterval:(NSTimeInterval)timeInterval
{
if (_delegateFlags.delegateVideoPlayerNodeDidStallAtTimeInterval) {
[_delegate videoPlayerNode:self didStallAtTimeInterval:timeInterval];
}
}
- (void)videoNodeDidStartInitialLoading:(ASVideoNode *)videoNode
{
if (_delegateFlags.delegateVideoPlayerNodeDidStartInitialLoading) {
[_delegate videoPlayerNodeDidStartInitialLoading:self];
}
}
- (void)videoNodeDidFinishInitialLoading:(ASVideoNode *)videoNode
{
if (_delegateFlags.delegateVideoPlayerNodeDidFinishInitialLoading) {
[_delegate videoPlayerNodeDidFinishInitialLoading:self];
}
}
- (void)videoNodeDidRecoverFromStall:(ASVideoNode *)videoNode
{
if (_delegateFlags.delegateVideoPlayerNodeDidRecoverFromStall) {
[_delegate videoPlayerNodeDidRecoverFromStall:self];
}
}
#pragma mark - Actions
- (void)togglePlayPause
{
@@ -702,6 +786,11 @@ static void *ASVideoPlayerNodeContext = &ASVideoPlayerNodeContext;
_delegateFlags.delegateTimeLabelAttributedString = [_delegate respondsToSelector:@selector(videoPlayerNode:timeStringForTimeLabelType:forTime:)];
_delegateFlags.delegatePlaybackButtonTint = [_delegate respondsToSelector:@selector(videoPlayerNodePlaybackButtonTint:)];
_delegateFlags.delegateDidTapVideoPlayerNode = [_delegate respondsToSelector:@selector(didTapVideoPlayerNode:)];
_delegateFlags.delegateVideoPlayerNodeDidSetCurrentItem = [_delegate respondsToSelector:@selector(videoPlayerNode:didSetCurrentItem:)];
_delegateFlags.delegateVideoPlayerNodeDidStallAtTimeInterval = [_delegate respondsToSelector:@selector(videoPlayerNode:didStallAtTimeInterval:)];
_delegateFlags.delegateVideoPlayerNodeDidStartInitialLoading = [_delegate respondsToSelector:@selector(videoPlayerNodeDidStartInitialLoading:)];
_delegateFlags.delegateVideoPlayerNodeDidFinishInitialLoading = [_delegate respondsToSelector:@selector(videoPlayerNodeDidFinishInitialLoading:)];
_delegateFlags.delegateVideoPlayerNodeDidRecoverFromStall = [_delegate respondsToSelector:@selector(videoPlayerNodeDidRecoverFromStall:)];
}
}