如何在AVFoundation中循环播放video,而不会有不必要的暂停?
我正试图播放无限期循环的video剪辑。 我按照苹果公司的build议来做这件事。 通过设置由AVPlayerItemDidPlayToEndTimeNotification触发的通知:
@property(nonatomic) AVPlayer *videoPlayer; @property(nonatomic) AVPlayerItem *videoPlayerItem; -(void)loadVideo { NSURL *url = [[NSBundle mainBundle] URLForResource:filename withExtension:extension]; AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil]; NSString *tracksKey = @"tracks"; [asset loadValuesAsynchronouslyForKeys:@[tracksKey] completionHandler: ^{ dispatch_async(dispatch_get_main_queue(), ^{ NSError *error; AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey error:&error]; if (status == AVKeyValueStatusLoaded) { [self setVideoPlayerItem:[AVPlayerItem playerItemWithAsset:asset]]; [videoPlayerItem addObserver:self forKeyPath:@"status" options:0 context:&ItemStatusContext]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector (videoPlayerItemDidReachEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:videoPlayerItem]; [self setVideoPlayer:[AVPlayer playerWithPlayerItem:videoPlayerItem]]; [scenePlayerView setVideoPlayer:videoPlayer]; } }); }]; }
当被触发时,这会调用我的方法来有效地回放并再次播放剪辑:
-(void)videoPlayerItemDidReachEnd:(NSNotification *)notification { [videoPlayerItem seekToTime:kCMTimeZero]; [videoPlayer play]; }
问题是,每当它遇到这个方法时,在video回放中都会有一个简短而明显的暂停,并循环回到开头。
video剪辑是H.264,并已在其他播放器上进行testing,以确保其内容中没有可见的“跳过”。 这一切都发生在iOS6模拟器和iPad2和iPad3上。
我究竟做错了什么?
不幸的是,实际上目前使用AVPlayer目前还不行,在每种情况下,在AVPlayer开始播放时都会出现一个不可避免的呃逆。 所以“混乱”的黑客似乎是解决这个问题的唯一方法,使用多个AVPlayers等。
你有两种可能的方法来获得一个真正专业的外观没有毛刺(AVPlayer本身不会工作)。 首先,您可以将原始video解码为一系列RGB帧(图像)。 然后对新的h.264video进行编码,然后将这些帧送入比第一个更长的h.264video。 例如,您可能会编码一个10秒的循环片段6次,使剪辑持续一分钟或6 * 5,使循环播放5分钟,而不会在循环重新启动时出现毛刺。 然后,打开较长的剪辑,并用AVPlayer播放,一段时间后不会出现毛刺。
第二种方法是使用已经处理无缝循环的现有库。 你可以看看我的图书馆,看到我的答案基本上是同一个问题,从一个video到另一个iphone平滑过渡 。 链接答案中的示例中的字符使用一个重复的“循环”video剪辑,当没有button被按下时,它会反复循环。
我设法让它工作与两个AVPlayer
,两个AVPlayerLayer
添加到两个不同的意见(我已经尝试添加到相同的观点,上面的一卡住一会儿),并切换这两个视图之间的alpha值。