2012-02-04 37 views
6

CALayer içinde harici içeriği, AVPlayer ile yüksek doğrulukta senkronize eden bir sorun yaşıyorum.AVPlayer ile çerçeve senkronizasyonu

İlk düşüncem bir CAKeyframeAnimation içinde bir kareler dizisi (videodaki karelerin sayısına eşit) düzenlemek ve AVSynchronizedLayer ile eşitlemekti. Bununla birlikte, video karesi çerçevesinde adım adım atıldığında, AVPlayer ve Çekirdek Animasyonun, farklı döngüler üzerinde yeniden çizildiği anlaşılıyor, çünkü bunlar senkronize edilmeden önce aralarında küçük (ama dikkat çekici) bir gecikme var.

Çekirdek Video üzerinden işleme ve görüntüleme kısa, çerçeve düzeyinde bir AVPlayer ile doğru bir şekilde senkronize etmenin bir yolu var mı?

Güncelleme: 5 Şubat

2012 Şimdiye kadar bunu yapmak buldum iyi yolu AVVideoCompositionCoreAnimationTool ve CAKeyFrameAnimation ile birleştiğinde AVAssetExportSession aracılığıyla önceden kılmaktır. Bununla birlikte, bunu yapmak için herhangi bir gerçek zamanlı yol öğrenmeyi hala çok ilgimi çekiyorum.

cevap

3

"Yüksek hassasiyet" ile ne demek istiyorsun?

Dokümanlar, bir AVAssetReader'un gerçek zamanlı kullanım için tasarlanmadığını iddia etseler de, pratikte bunu kullanarak gerçek zamanlı video okumada sorun yaşamadım (cf https://stackoverflow.com/a/4216161/42961). Döndürülen kareler, CMSampleBufferGetPresentationTimeStamp'u kullanarak getirebileceğiniz bir 'Sunum zaman damgası' ile gelir.

Projenin bir bölümünün burada 'master' zamanlayıcısı olmasını istersiniz. CALayer animasyonunuzun hesaplanması hızlıdır ve disk erişimi gibi potansiyel olarak engelli şeyler içermiyorsa, bunu ana zaman kaynağı olarak kullanırdım. Eğer copyNextSampleBufferCMSampleBufferGetPresentationTimeStamp kadar getiri> = currentTime kullanarak AVAssetReader 'ın video kareleri ile devam cer Gerekiyorsa, CALayer animasyondan currentTime okumalısınız (sizin UIView alt sınıf üzerinde draw seçicinin örn) içeriği çizmek gerekir ve ne zaman daha sonra CALayer animasyon içeriğini en üste çizin.

1

Eğer müzikçalarınız AVURLAsset kullanıyorsa, bunu kesin süre bayrağı ayarlanmış mı? Yani gibi bir şey:

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