Objective c 基于AVPlayer的帧同步

Objective c 基于AVPlayer的帧同步,objective-c,ios,video,core-animation,avfoundation,Objective C,Ios,Video,Core Animation,Avfoundation,我在将CALayer中的外部内容与AVPlayer高精度同步时遇到问题 我的第一个想法是在CAKeyframeAnimation中布置一组帧(等于视频中的帧数),并与AVSynchronizedLayer同步。但是,在逐帧逐行扫描视频时,似乎AVPlayer和核心动画在不同的周期上重新绘制,因为在同步之前,它们之间有轻微(但明显)延迟 除了通过核心视频进行处理和显示外,是否有办法在帧级别上与AVPlayer精确同步 更新日期:2012年2月5日 到目前为止,我发现最好的方法是通过avassete

我在将
CALayer
中的外部内容与
AVPlayer
高精度同步时遇到问题

我的第一个想法是在
CAKeyframeAnimation
中布置一组帧(等于视频中的帧数),并与
AVSynchronizedLayer
同步。但是,在逐帧逐行扫描视频时,似乎
AVPlayer
和核心动画在不同的周期上重新绘制,因为在同步之前,它们之间有轻微(但明显)延迟

除了通过核心视频进行处理和显示外,是否有办法在帧级别上与
AVPlayer
精确同步

更新日期:2012年2月5日

到目前为止,我发现最好的方法是通过
avassetextortsession
AVVideoCompositionCoreAnimationTool
CAKeyFrameAnimation
进行预渲染


不过,我仍然对学习任何实时方法非常感兴趣。

你说的“高精度”是什么意思

尽管文档声称,
avassetrader
不是为实时使用而设计的,但实际上,我在使用它实时读取视频(cf)时没有遇到任何问题。返回的帧带有“演示时间戳”,您可以使用
CMSampleBufferGetPresentationTimeStamp
获取该时间戳


你会希望项目的一部分成为这里的“主”计时员。假设您的
CALayer
动画计算速度快,并且不涉及磁盘访问之类的潜在阻塞,我会将其用作主时间源。当您需要绘制内容时(例如在
UIView
子类的
draw
选择器中),您应该从
CALayer
动画中读取
currentTime
,如有必要,使用
copyNextSampleBuffer
继续查看
Avassetrader
的视频帧,直到
CMSampleBufferGetPresentationTimeStamp
返回>=
currentTime
,绘制帧,然后在顶部绘制CALayer动画内容。

如果您的播放器使用的是AVURLAsset,你加载时是否设置了精确的持续时间标志?例如:

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