Я использую стандартную CoreVideo Display Link + QTVisualContext для рендеринга фильма QuickTime в подкласс NSOpenGLView
. Теперь я хотел бы синхронизировать просмотр временной шкалы с воспроизведением фильма. Представление временной шкалы реализовано как представление размещения слоя, на котором размещается подкласс CAOpenGLLayer
, который отображает временную шкалу. Я выбрал эту архитектуру, потому что CAOpenGLLayer
получает CVTimeStamp
для рендеринга. Я подумал, что смогу использовать эту метку времени, чтобы получить текущее время фильма из QTVisualContext.
Единственный способ получить время фильма из CVTimeStamp - это скопировать QTVisualContext в CVImageBuffer (используя QTVisualContextCopyImageForTime
), а затем извлечь время фильма из вложения kCVBufferMovieTimeKey
CVImageBuffer. Очевидно, это немного излишне, поскольку мне не нужно изображение. Кроме того, документация для QTVisualContextCopyImageForTime
указывает, что запрос времени до предыдущего вызова не разрешен. Поскольку я не могу гарантировать порядок событий между потоком CoreAnimation и потоком ссылки на отображение CoreVideo, я зашел в тупик.
Похоже, что CVDisplayLinkTranslateTime
должен быть в состоянии преобразовать CVTimeStamp, который я получаю в методе рендеринга CAOpenGLLayer
, во время фильма и временную базу фильма, но я не уверен, как связать это время (Показать ссылку) время фильма QuickTime. Я не обязательно знаю, когда время фильма 0 относительно времени фильма Display Link.
Итак, есть ли способ получить время фильма для CVTimeStamp непосредственно из QTVisualContext (или где-либо еще в пути QTMovie-> QTVisualContext-> Display Link -> ...)?