2012-02-04 12 views
6

Tengo un problema al sincronizar contenido externo en un CALayer con un AVPlayer con alta precisión.Sincronización de fotogramas con AVPlayer

Mi primer pensamiento fue diseñar una matriz de cuadros (igual al número de cuadros en el video) dentro de un CAKeyframeAnimation y sincronizar con un AVSynchronizedLayer. Sin embargo, al recorrer el video fotograma a fotograma, parece que AVPlayer y Core Animation vuelven a dibujarse en ciclos diferentes, ya que existe un ligero (pero notable) retraso entre ellos antes de que se sincronicen.

Si no se procesa y se visualiza a través de Core Video, ¿hay alguna manera de sincronizar con precisión con un AVPlayer en el nivel del marco?

actualización: 5 Febrero 2012

Hasta ahora la mejor manera que he encontrado para hacer esto es a través de un procesamiento previo de AVAssetExportSession junto con AVVideoCompositionCoreAnimationTool y una CAKeyFrameAnimation.

Sin embargo, estoy muy interesado en aprender sobre cualquier forma de hacer esto en tiempo real.

Respuesta

3

¿Qué quiere decir con 'alta precisión?'

Aunque los documentos afirman que un AVAssetReader no está diseñado para el uso en tiempo real, en la práctica no he tenido problemas para leer video en tiempo real al usarlo (cf https://stackoverflow.com/a/4216161/42961). Los marcos devueltos vienen con una 'Marca de tiempo de presentación' que puede buscar usando CMSampleBufferGetPresentationTimeStamp.

Querrá que una parte del proyecto sea el cronómetro "maestro" aquí. Suponiendo que su animación CALayer es rápida de calcular y no incluye elementos potencialmente bloqueantes como el acceso al disco, la usaría como fuente de tiempo maestra. Cuando usted tiene que dibujar el contenido (por ejemplo, en el selector de draw en su UIView subclase) debe leer currentTime del CALayer animación, si es necesario proceder a través de fotogramas de vídeo del AVAssetReader 's utilizando copyNextSampleBuffer hasta CMSampleBufferGetPresentationTimeStamp retornos> = currentTime, dibujar el marco, y luego dibuje el contenido de la animación CALayer sobre la parte superior.

1

Si su reproductor está utilizando un AVURLAsset, ¿lo cargó con el indicador de duración precisa establecido? Es decir. algo como:

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