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];