2012-02-04 20 views
6

CALayerの外部コンテンツとの同期に問題があります。精度はAVPlayerです。AVPlayerとのフレーム同期

私の最初の考えは、CAKeyframeAnimation内のフレームの配列(ビデオのフレーム数に等しい)をレイアウトし、AVSynchronizedLayerと同期させることでした。しかし、フレームごとにビデオをステップ実行すると、AVPlayerとコアアニメーションが異なるサイクルで再描画されるように見えます。なぜなら、それらが同期する前に若干の(しかし顕著な)遅延があるからです。

Core Videoによる処理と表示が不十分な場合、フレームレベルでAVPlayerと正確に同期する方法はありますか?

更新日:2012年2月5日

これまでのところ、私はこれを行うために見つけた最良の方法はAVVideoCompositionCoreAnimationToolCAKeyFrameAnimationと相まってAVAssetExportSessionてプリレンダリングすることです。

私はまだこれを行うリアルタイムの方法の学習に非常に興味があります。

答えて

3

「高精度」とはどういう意味ですか? は実時間での使用のために設計されていないと主張していますが、実際にはそれを使用してリアルタイムでビデオを読むことに問題はありませんでした(cf https://stackoverflow.com/a/4216161/42961)。返されるフレームには、CMSampleBufferGetPresentationTimeStampを使用して取得できる「プレゼンテーションタイムスタンプ」が付いています。

ここで、プロジェクトの1つの部分を「マスター」タイムキーパーにしたいと思うでしょう。あなたのCALayerアニメーションが計算が速く、ディスクアクセスのような不安定なものが含まれていないとすれば、私はそれをマスタータイムソースとして使用します。あなたは、copyNextSampleBufferCMSampleBufferGetPresentationTimeStampまで戻ります> = currentTimeを使用してAVAssetReaderのビデオ・フレームを進めフレームを描く必要な場合は、CALayerアニメーションからcurrentTimeをお読みください(ごUIViewサブクラスにdrawセレクタ中など)コンテンツを描画する必要がある、とするとその上にCALayerのアニメーションコンテンツを描画します。

1

プレイヤーがAVURLAssetを使用している場合、正確な期間フラグを設定してロードしましたか?私。次のようなもの:

NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; 
AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:aUrl options:options];