我正在尝试播放无限循环的视频剪辑。我按照苹果推荐的方式这样做;通过设置由 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];
}
问题是,每次点击此方法并循环回到开头时,视频播放都会出现短暂但可见的停顿。
视频剪辑是 H.264 并且已经在其他播放器中进行了测试,以确保它们的内容没有明显的“跳过”。这一切都发生在 iOS6 下的模拟器和 iPad2 和 iPad3 上。
我做错了什么?
最佳答案
您有两种可能的方法来获得真正专业的无故障循环(AVPlayer 本身不起作用)。首先,您可以拍摄原始视频并将其解码为一系列 RGB 帧(图像)。然后对一个新的 h.264 视频进行编码,并将帧馈送到比第一个长得多的更长的 h.264 视频中。例如,您可以将一个 10 秒的循环剪辑编码 6 次以制作一个持续一分钟的剪辑,或者编码 6 * 5 以制作一个可以在循环重新开始时播放 5 分钟而不会出现故障的剪辑。然后,打开较长的片段,用AVPlayer播放,一段时间内不会出现毛刺。
第二种方法是使用已经处理无缝循环的现有库。你可以看看我的图书馆,看看我对基本相同问题的回答iphone-smooth-transition-from-one-video-to-another .链接答案示例中的角色使用一个视频剪辑的重复“循环”,当没有按下任何按钮时,该视频剪辑会一遍又一遍地循环。
关于ios - 如何使用 AVFoundation 循环播放视频,最后没有不必要的停顿?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13428831/