【问题标题】:Frame synchronization with AVPlayer与 AVPlayer 的帧同步
【发布时间】:2012-02-26 21:30:16
【问题描述】:

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

我的第一个想法是在CAKeyframeAnimation 中布置一组帧(等于视频中的帧数)并与AVSynchronizedLayer 同步。但是,在逐帧浏览视频时,AVPlayer 和 Core Animation 似乎在不同的周期重绘,因为在它们同步之前它们之间存在轻微(但明显)的延迟。

通过Core Video处理和显示不足,有没有办法在帧级别上与AVPlayer准确同步?

更新:2012 年 2 月 5 日

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

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

【问题讨论】:

    标签: objective-c ios video core-animation avfoundation


    【解决方案1】:

    “高精度”是什么意思?

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

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

    【讨论】:

      【解决方案2】:

      如果您的播放器正在使用 AVURLAsset,您是否在加载时设置了精确的持续时间标志? IE。类似:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多