与AVPlayer的帧同步

sev*_*low 6 video core-animation objective-c avfoundation ios

我有一个问题,同步的外部内容CALayerAVPlayer高精度.

我的第一个想法是在a中布置一个帧数组(等于视频中的帧数)CAKeyframeAnimation并与之同步AVSynchronizedLayer.然而,在逐帧逐步浏览视频时,看起来AVPlayer核心动画会在不同周期重绘,因为它们在同步之前会有轻微(但明显)的延迟.

没有通过核心视频处理和显示,有没有办法准确地与AVPlayer帧级别同步?

更新:2012年2月5日

到目前为止,我发现这样做的最好方法是预渲染通过AVAssetExportSession耦合AVVideoCompositionCoreAnimationTool和a CAKeyFrameAnimation.

然而,我仍然对学习任何实时方法感兴趣.

dam*_*ian 3

“高精度”是什么意思?

尽管文档声称 anAVAssetReader不是为实时使用而设计的,但实际上我使用它实时阅读视频没有任何问题(参见/sf/answers/295131301/)。返回的帧带有“演示时间戳”,您可以使用 来获取它CMSampleBufferGetPresentationTimeStamp

您会希望项目的一部分成为此处的“主”计时员。假设您的CALayer动画计算速度很快并且不涉及磁盘访问等潜在的块状事物,我会使用它作为主时间源。当您需要绘制内容时(例如,在子类draw的选择器中UIView),您应该currentTimeCALayer动画中读取内容,如有必要,使用until returns >=继续AVAssetReader遍历 的视频帧,绘制帧,然后在 CALayer 上绘制 CALayer 动画内容顶部。copyNextSampleBufferCMSampleBufferGetPresentationTimeStampcurrentTime