AVPlayer的帧同步

6
我在使用AVPlayer高精度同步外部内容到CALayer时遇到了问题。我的第一想法是在CAKeyframeAnimation中布置一个与视频帧数相等的框架数组,并与AVSynchronizedLayer同步。然而,逐帧查看视频时,似乎AVPlayer和核心动画在不同的周期上重绘,因此它们之间存在轻微(但明显)的延迟,然后才同步。
除了通过Core Video处理和显示外,是否有一种准确地在帧级别上与AVPlayer同步的方法?
更新:2012年2月5日
到目前为止,我发现最好的方法是通过AVAssetExportSession预先渲染,结合AVVideoCompositionCoreAnimationTool和CAKeyFrameAnimation。但是,我仍然非常有兴趣学习任何实时完成此操作的方法。
2个回答

3

什么是“高精度”?

尽管文档声称AVAssetReader不适用于实时使用,但在实践中,我使用它实时读取视频时没有遇到任何问题(参见https://dev59.com/P2855IYBdhLWcg3w_5cQ#4216161)。返回的帧带有“演示时间戳”,您可以使用CMSampleBufferGetPresentationTimeStamp来获取它。

您需要将项目的一个部分作为“主”时间源。假设您的CALayer动画计算快速且不涉及可能导致块状的内容(如磁盘访问),则应将其用作主时间源。当您需要绘制内容时(例如,在UIView子类的draw选择器中),如果必要,应从CALayer动画中读取currentTime,并通过copyNextSampleBuffer处理AVAssetReader的视频帧,直到CMSampleBufferGetPresentationTimeStamp返回>=currentTime,然后绘制帧,最后在顶部绘制CALayer动画内容。


2
如果您的播放器使用AVURLAsset,您是否设置了精确持续时间标志来加载它?例如:
NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey];
AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:aUrl options:options];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接