首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于AVPlayer的帧同步

基于AVPlayer的帧同步
EN

Stack Overflow用户
提问于 2012-02-04 17:00:53
回答 2查看 2.7K关注 0票数 6

我在用高精度的CALayerAVPlayer同步外部内容时遇到了问题。

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

除了通过核心视频进行处理和显示外,是否有一种方法可以在帧级别上准确地与AVPlayer同步?

更新:2012年2月5日

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-23 20:34:32

什么叫“高精度”?

尽管docs声称AVAssetReader不是为实时使用而设计的,但实际上我在实时使用它时阅读视频(cf https://stackoverflow.com/a/4216161/42961)并没有问题。返回的帧带有一个“演示时间戳”,您可以使用CMSampleBufferGetPresentationTimeStamp获取它。

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

票数 3
EN

Stack Overflow用户

发布于 2013-02-23 00:04:00

如果您的播放器使用的是AVURLAsset,那么您是否使用了精确的持续时间标志来加载它?例如:

代码语言:javascript
复制
NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey];
AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:aUrl options:options];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9142629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档