3

我正在使用标准的 CoreVideo Display Link + QTVisualContext 将 QuickTime 电影渲染到NSOpenGLView子类中。我现在想将时间线视图与电影播放同步。时间线视图被实现为一个图层托管视图,托管一个CAOpenGLLayer渲染时间线的子类。我选择了这种架构,因为它CAOpenGLLayer可以CVTimeStamp用于渲染。我以为我可以使用这个时间戳从 QTVisualContext 中获取当前电影时间。

我发现从 CVTimeStamp 获取电影时间的唯一方法是将 QTVisualContext 复制到 CVImageBuffer 中(使用QTVisualContextCopyImageForTime),然后从 CVImageBuffer 的kCVBufferMovieTimeKey附件中检索电影时间。显然,这似乎有点矫枉过正,因为我不需要图像。此外,文档QTVisualContextCopyImageForTime表明不允许在前一个呼叫之前要求时间。由于我无法保证CoreAnimation线程和CoreVideo显示链接线程之间的事件顺序,所以我陷入了死胡同。

似乎CVDisplayLinkTranslateTime应该能够将我在CAOpenGLLayer渲染方法中获得的 CVTimeStamp 转换为电影时间和电影时间基准,但我不确定如何将此(显示链接)时间与 QuickTime 电影的时间联系起来。我不一定知道电影的时间 0 何时相对于 Display Link 电影时间。

那么,有没有办法直接从 QTVisualContext(或 QTMovie->QTVisualContext->Display Link->...)路径中的任何其他地方获取 CVTimeStamp 的电影时间?

4

0 回答 0