gpt4 book ai didi

ios - AVPlayer replaceCurrentItemWithPlayerItem 打破 UIViewAnimation

转载 作者:行者123 更新时间:2023-11-28 22:52:02 32 4
gpt4 key购买 nike

我有两个交叉渐变 View Controller ,它们都在其 subview 中播放视频。 View A 中的视频在淡入开始时开始播放,在淡出结束时停止。 View B 中的视频在淡入时开始,在淡出后停止。基本的东西。我让它在 MPMoviePlayerController 上工作得很好,但我也想做音频淡入/淡出,这迫使我使用 AVFoundationFramework 的 AVPlayer。基本上一切似乎都正常,但我注意到开关导致淡入中断。 View B alpha 只是从 0 跳到 1,并且 UIView animateWithDuration 的完成 block 被调用为 false 值。我注意到这仅在我在 loadView 方法期间调用 AVPlayer 对象上的 replaceCurrentItemWithPlayerItem: 方法时发生。

交叉渐变代码如下所示:

- (void)pushViewController:(UIViewController *)viewController duration:(float)duration
{
float halfFadeInOutTime = duration/2.0;
viewController.view.alpha = 0.0;
UIView *tmpView = self.view;


[viewController viewWillAppear:YES];

//start fading out the first view
[UIView animateWithDuration:halfFadeInOutTime
delay:0
options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
animations:^{
tmpView.alpha = 0.0;
}
completion:^(BOOL finished){
if( finished ){
if( [self respondsToSelector:@selector(fadeOutFinished:)] ){
[self fadeOutFinished:duration];
}


[self.navigationController pushViewController:viewController animated:NO];

//start fading in with the second view
[UIView animateWithDuration:halfFadeInOutTime
delay:0
options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
animations:^{
viewController.view.alpha = 1.0;
}
completion:^(BOOL finished2){
if( finished2 ){
if( [((CrossfadeableViewController*)viewController) respondsToSelector:@selector(fadeInFinished:)] ){
[((CrossfadeableViewController*)viewController) fadeInFinished:duration];
}
}
}
];

if( [((CrossfadeableViewController*)viewController) respondsToSelector:@selector(fadeInStarted:)] ){
[((CrossfadeableViewController*)viewController) fadeInStarted:duration];
}


}
}
];

if( [self respondsToSelector:@selector(fadeOutStarted:)] ){
[self fadeOutStarted:duration];
}
}

loadView中的AVPlayer相关代码如下所示

- (void) loadView
{
[super loadView]

//...

/*
* Variables of type:
* UIView *videoPlaceholder;
* AVURLAsset *asset;
* AVPlayerItem *playerItem;
* AVPlayer *player;
* AVPlayerLayer *playerLayer;
*/

videoPlaceholder = [[UIView alloc] initWithFrame:_frame];

playerLayer = [[AVPlayerLayer alloc] init];
[playerLayer setFrame:videoPlaceholder.frame];
playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
player = [[AVPlayer alloc] init];

NSString *_url = [[NSBundle mainBundle] pathForResource:[_videoFilename stringByDeletingPathExtension] ofType:[_videoFilename pathExtension]];
if( _url != nil ){
NSURL *url = [NSURL fileURLWithPath:_url];

asset = [AVURLAsset URLAssetWithURL:url options:nil];

playerItem = [AVPlayerItem playerItemWithAsset:asset];

[player replaceCurrentItemWithPlayerItem:playerItem];
[player seekToTime:kCMTimeZero];
[player setActionAtItemEnd:AVPlayerActionAtItemEndNone];
}



playerLayer.player = player;
[videoPlaceholder.layer addSublayer:playerLayer];

[self.view addSubview:videoPlaceholder];

//....
}

有谁知道什么会导致动画中断?我在动画期间没有更改 View 中的任何内容,因为在交叉淡化开始之前调用了 loadView。什么会导致相同的代码与 MPMoviePlayerController 一起工作而与 AVPlayer 一起中断?

干杯,铅

最佳答案

事实证明这是正在加载的 AVPlayerItem 的问题。我必须等到电影加载完毕 - 否则动画淡入淡出就坏了

等待视频加载完成的示例代码:

- (void)observeValueForKeyPath:(NSString*) path 
ofObject:(id)object
change:(NSDictionary*)change
context:(void*)context {
if (context == AVPlayerDemoPlaybackViewControllerStatusObservationContext) {
AVPlayerStatus status = [[change objectForKey:NSKeyValueChangeNewKey] integerValue];
if (status == AVPlayerStatusReadyToPlay) {
if( [self.videoStateChangeDelegate respondsToSelector:@selector(videoStateChangedToReadyForPlayback)] ){
[self.videoStateChangeDelegate videoStateChangedToReadyForPlayback];
}
[self.player play];
}
}
}

[self.videoStateChangeDelegate videoStateChangedToReadyForPlayback] 通知我的委托(delegate) Controller 它可以开始淡入。太糟糕了,因为这个问题,我的简单代码变得有点复杂。

关于ios - AVPlayer replaceCurrentItemWithPlayerItem 打破 UIViewAnimation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11744409/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com