我正在尝试播放无限循环的视频剪辑。我正在按照苹果建议的方式这样做;通过设置由 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从一个视频到另一个视频的平滑过渡 https://stackoverflow.com/questions/3410003/iphone-smooth-transition-from-one-video-to-another/17138580#17138580。链接答案示例中的角色使用一个视频剪辑的重复“循环”,当没有按下任何按钮时,该视频剪辑会一遍又一遍地循环。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)