我正在使用标准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的电影时间?