mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 22:55:00 +00:00
[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:
@@ -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:)];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user