ios objective-c avfoundation qtkit

¿Alternativa de iOS a QTMovieLayer que tiene "contenidos" nulos?



objective-c avfoundation (1)

Fondo

QTKit (QuickTime Kit) es un marco de Mac de los 10.3 días que obtuvo algunas adiciones de capas en 10.5 como por ejemplo QTMovieLayer . Una de las cosas buenas de QTMovieLayer es que puede acceder al contenido de la película utilizando la propiedad de content normal en la capa y recuperar un objeto CAImageQueue . Lo bueno de esto es que puede crear un montón de CALayer regulares y establecer la cola de imágenes como su contenido y dar a todas las capas su propia parte de la película configurando el contenido correcto. Esto significa que puede crear algo como la imagen a continuación con solo una película en ejecución y obtendrá tanto la sincronización como la eficiencia de la memoria.

Podría publicar este código, pero dudo que sea relevante para mi pregunta ya que la pregunta es sobre iOS y QTKit no existe allí.

Mi problema

Quiero hacer lo mismo en iOS pero QTKit no existe allí. Es decir, estoy buscando una alternativa a QTMovieLayer que existe en iOS donde la propiedad del content no es nula (esta es la parte importante) para poder compartir el contenido entre varias capas.

Además, cuando logro que un video se reproduzca en varias capas, quiero poder especificar qué parte del video debería reproducirse en qué capa (como en la imagen de arriba)

Lo que he intentado

En iOS tienes AVFoundation o el marco de MediaPlayer para reproducir películas. En AVFoundation tienes AVPlayerLayer que puede mostrar películas. (También tiene AVCaptureVideoPreviewLayer para mostrar la vista previa de la entrada de la cámara y AVSynchronizedLayer para sincronizar pero no mostrar los videos).

Nota: en todos estos ejemplos conseguí que el video se reproduzca en la capa con sonido y todo. Ese no es mi problema. El problema es que no puedo obtener el contenido para compartirlo con otras capas.

He leído la Nota técnica TN2300 - Transición del código QTKit a AV Foundation, pero no pude encontrar nada sobre compartir contenido de video entre capas.

AVPlayerLayer

Si creo una capa de jugador como esta y trato de obtener el contents , solo recupero nil

NSURL *videoURL = [[NSBundle mainBundle] URLForResource:@"video" withExtension:@"m4v"]; AVPlayer *player = [AVPlayer playerWithURL:videoURL]; [player play]; AVPlayerLayer *videoLayer = [AVPlayerLayer playerLayerWithPlayer:player]; id videoContent = videoLayer.contents // <-- this is nil :(

AVCaptureVideoPreviewLayer

A pesar de que estoy realmente interesado en reproducir un archivo de película, intenté usar una capa de vista previa de captura pero el contenido es nulo como antes

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; NSError *error = nil; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; AVCaptureSession *captureSession = [AVCaptureSession new]; [captureSession addInput:input]; AVCaptureVideoPreviewLayer *Layer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession]; [captureSession startRunning]; id videoContent = videoLayer.contents // <-- this is still nil :(

AVSynchronizedLayer

Por su nombre, puede pensar que la capa sincronizada sería lo que estoy buscando pero no se usa para mostrar nada (documentación del encabezado del formulario):

Un AVSynchronizedLayer es similar a un CATransformLayer en que no muestra nada en sí mismo, sino que solo confiere un estado a su subárbol de capas.

Marco de MediaPlayer

El marco del reproductor multimedia no tiene una variante de capa y crear un controlador de vista de jugador y obtener la capa de la vista de jugadores no me pareció una opción válida. (Sí, ni siquiera me molesté en probarlo).

Resumen de la pregunta:

¿Existe alguna alternativa a QTMovieLayer que exista en iOS donde pueda obtener el contenido del video que se está reproduciendo actualmente y visualizar partes de él en otras muchas capas al mismo tiempo?


Para obtener el búfer de datos de video / audio de la sesión de captura o sesión del reproductor,

  • Cree el objeto AVCaptureVideoDataOutput / AVCaptureAudioDataOutput.
  • Confirme uno de sus a AVCaptureVideoDataOutputSampleBufferDelegate.
  • Agregue AVCaptureVideoDataOutput a su sesión de Capture / Player.
  • Implementar métodos de protocolo. Recibirá el objeto CMSampleBufferRef que contiene cuadros de video / audio cuando el medio se capture / reproduzca en el método captureOutput ... de AVCaptureVideoDataOutputSampleBufferDelegate.

El objeto CMSampleBufferRef contiene datos de cuadros de medios, información de marca de tiempo y la descripción del formato de los medios. Luego puede mostrar este marco convirtiéndolo en CGImageRef y mostrarlo en cualquier vista.

También puede especificar el formato de compresión de marco deseado (o el formato de marco sin comprimir) en la propiedad AVCaptureVideoDataOutput.videoSettings.