標準の CoreVideo Display Link + QTVisualContext を使用して、QuickTime ムービーをNSOpenGLView
サブクラスにレンダリングしています。タイムライン ビューをムービーの再生と同期させたいと思います。タイムライン ビューは、レイヤー ホスティング ビューとして実装され、CAOpenGLLayer
タイムラインをレンダリングするサブクラスをホストします。がレンダリング用に をCAOpenGLLayer
取得するため、このアーキテクチャを選択しました。CVTimeStamp
このタイム スタンプを使用して、QTVisualContext から現在のムービー時間を取得できると考えました。
CVTimeStamp から映画の時間を取得する唯一の方法は、QTVisualContext を CVImageBuffer にコピーし ( を使用QTVisualContextCopyImageForTime
)、CVImageBuffer のkCVBufferMovieTimeKey
添付ファイルから映画の時間を取得することです。明らかに、私は画像を必要としないので、これは少しやり過ぎのように思えます。さらに、 のドキュメントにQTVisualContextCopyImageForTime
は、前の呼び出しの前に時間を尋ねることは許可されていないことが示されています。CoreAnimation スレッドと CoreVideo 表示リンク スレッドの間のイベントの順序を保証できないため、行き止まりに陥りました。
レンダリング メソッドで取得したCVTimeStampCVDisplayLinkTranslateTime
をムービー時間とムービー タイム ベースに変換できるはずCAOpenGLLayer
ですが、この (表示リンク) 時間を QuickTime ムービーの時間に関連付ける方法がわかりません。ムービーの時間 0 が Display Link のムービー時間に対していつ相対的なのか、必ずしもわかりません。
では、CVTimeStamp のムービー時間を QTVisualContext (または QTMovie->QTVisualContext->Display Link->...) 経路から直接取得する方法はありますか?