我正在使用AVFoundation的AVPlayer播放由1个较长视频制作的2个视频片段(因此第一个片段的结尾与第二个片段的开头相匹配)
当第一个视频结束并且用户点击时,我创建一个新的AVPlayer并将其分配给我的PlayerView,并开始播放第二个剪辑 .
这一切都有效,但是,有一个 prominent 屏幕"flicker" .
我的假设是,这是由玩家视图删除第一个剪辑然后显示第二个剪辑引起的 .
我需要的是这个闪烁没有出现,因此在两个剪辑之间进行无缝连接 .
有没有人知道是否有办法停止这个flickr,要么通过AVPlayer *类,要么通过做某事来做到这一点,所以这是不可见的 . -2918055_
谢谢
下面是我的加载和播放方法的代码:
- (void)loadAssetFromFile
{
NSURL *fileURL = nil;
switch (playingClip)
{
case 1:
fileURL = [[NSBundle mainBundle] URLForResource:@"wh_3a" withExtension:@"mp4"];
break;
case 2:
fileURL = [[NSBundle mainBundle] URLForResource:@"wh_3b" withExtension:@"mp4"];
break;
case 3:
fileURL = [[NSBundle mainBundle] URLForResource:@"wh_3c" withExtension:@"mp4"];
break;
case 4:
fileURL = [[NSBundle mainBundle] URLForResource:@"wh_3d" withExtension:@"mp4"];
break;
default:
return;
break;
}
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil];
NSString *tracksKey = @"tracks";
[asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:tracksKey] completionHandler:
^{
// The completion block goes here.
NSError *error = nil;
AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey error:&error];
if (status == AVKeyValueStatusLoaded)
{
self.playerItem = [AVPlayerItem playerItemWithAsset:asset];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidReachEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];
self.player = [AVPlayer playerWithPlayerItem:playerItem];
[playerView setPlayer:player];
[self.player seekToTime:kCMTimeZero];
[self play];
}
else {
// Deal with the error appropriately.
NSLog(@"The asset's tracks were not loaded:\n%@", [error localizedDescription]);
}
}];
}
5 回答
我试过这个,它对我有用 .
但我也在分配自己的AVPlayerLayer,而不是使用IB来完成它 .
经过太多努力没有成功,我终于找到了一个解决方案,而不是最好的解决方案,但是有效
我的输入代码如下,请看 loadVideo 方法
我找到了一个非常简单的解决方案(对于某些人来说可能太简单了,但对我来说它确实有效):在Interface Builder中我 set the background color of my view (它附加了视频层) to black . 所以's just '闪现'黑色现在......
我找到了两种解决方法 . 对我来说这两种方法都有效,而我更喜欢第二种方法 .
首先,正如@Alex Kennberg所提到的,创建两组
AVPlayerLayer
和AVPlayer
. 在视频之间切换时切换它们 . 务必设置背景颜色以清除颜色 .其次,使用
UIImageView
作为AVPlayerLayer
的所有者视图 . 在切换视频之前,创建视频的缩略图图像并将其设置为imageview . 务必正确设置视图模式 .您无需为此任务重新创建
AVPlayer
. 您可以只有多个AVPlayerItem
然后通过[AVPlayer replaceCurrentItemWithPlayerItem:item]
切换哪一个是当前的 .此外,您可以使用以下代码观察当前项目的更改时间 .
...创建播放器后,注册观察者:
...