2012-02-04 144 views
6

我在高精度同步外部内容CALayerAVPlayer的问题。与AVPlayer的帧同步

我的第一个想法是在CAKeyframeAnimation内布置一排帧(等于视频中的帧数),并与AVSynchronizedLayer同步。但是,逐帧逐帧浏览视频时,似乎AVPlayer和Core Animation在不同的周期重绘,因为它们之间有一个轻微(但明显的)延迟,然后它们同步。

缺乏处理和通过核心视频显示,有没有一种方法可以在帧级别与AVPlayer准确同步?

更新:2012年2月5日

到目前为止,我发现做到这一点的最好办法是通过AVAssetExportSession加上AVVideoCompositionCoreAnimationToolCAKeyFrameAnimation预渲染。但是,我仍然非常有兴趣学习任何实时的方法来做到这一点。

回答

3

“高精度”是什么意思?

尽管文档声称AVAssetReader不是为实时使用而设计的,但在实践中,使用它实时阅读视频没有问题(参见https://stackoverflow.com/a/4216161/42961)。返回的帧带有'演示时间戳',您可以使用CMSampleBufferGetPresentationTimeStamp来获取。

你会希望项目的一部分成为'主'计时员。假设你的CALayer动画是快速计算的,并且不涉及潜在的块状的东西,比如磁盘访问,我会用它作为主时间源。当你需要绘制(您UIView子类在draw选择如)的含量,则应该从CALayer动画读currentTime,如果必要的话通过AVAssetReader的视频帧使用copyNextSampleBuffer直到CMSampleBufferGetPresentationTimeStamp收益> = currentTime出发,绘制框架和然后在顶部绘制CALayer动画内容。

1

如果您的播放器正在使用AVURLAsset,您是否使用精确的持续时间标志设置了它?即例如:

NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; 
AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:aUrl options:options];