Время фильма из QTVisualContext с учетом CVTimeStamp в методе рендеринга CAOpenGLLayer? - PullRequest
3 голосов
/ 04 февраля 2010

Я использую стандартную 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 -> ...)?

...