ios ios5 avfoundation core-media

Reproducción de video y recuperación del buffer de píxeles con ios5



avfoundation core-media (0)

Lo que me gustaría es reproducir un video (desde un archivo local y desde una URL remota) y su pista de audio y recuperar el buffer de píxeles de cada fotograma del video para dibujarlo en una textura OpenGL.

Aquí está el código que uso en iOS 6 (funciona bien):

Inicia el video

- (void) readMovie:(NSURL *)url { NSLog(@"Playing video %@", param.url); AVURLAsset * asset = [AVURLAsset URLAssetWithURL:url options:nil]; [asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler: ^{ dispatch_async(dispatch_get_main_queue(), ^{ NSError* error = nil; AVKeyValueStatus status = [asset statusOfValueForKey:@"tracks" error:&error]; if (status == AVKeyValueStatusLoaded) { NSDictionary* settings = @{ (id)kCVPixelBufferPixelFormatTypeKey : [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] }; AVPlayerItemVideoOutput* output = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:settings]; AVPlayerItem* playerItem = [AVPlayerItem playerItemWithAsset:asset]; [playerItem addOutput:output]; AVPlayer* player = [AVPlayer playerWithPlayerItem:playerItem]; [self setPlayer:player]; [self setPlayerItem:playerItem]; [self setOutput:output]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(bufferingVideo:) name:AVPlayerItemPlaybackStalledNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoEnded:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoFailed:) name:AVPlayerItemFailedToPlayToEndTimeNotification object:nil]; [[self player] addObserver:self forKeyPath:@"rate" options:0 context:nil]; [[self player] addObserver:self forKeyPath:@"status" options:0 context:NULL]; [player play]; } else { NSLog(@"%@ Failed to load the tracks.", self); } }); }]; }

Lea el búfer de video (en una función de actualización llamada cada fotograma)

- (void) readNextMovieFrame { CMTime outputItemTime = [[self playerItem] currentTime]; float interval = [self maxTimeLoaded]; CMTime t = [[self playerItem] currentTime]; CMTime d = [[self playerItem] duration]; NSLog(@"Video : %f/%f (loaded : %f) - speed : %f", (float)t.value / (float)t.timescale, (float)d.value / (float)d.timescale, interval, [self player].rate); [videoBar updateProgress:(interval / CMTimeGetSeconds(d))]; [videoBar updateSlider:(CMTimeGetSeconds(t) / CMTimeGetSeconds(d))]; if ([[self output] hasNewPixelBufferForItemTime:outputItemTime]) { CVPixelBufferRef buffer = [[self output] copyPixelBufferForItemTime:outputItemTime itemTimeForDisplay:nil]; // Lock the image buffer CVPixelBufferLockBaseAddress(buffer, 0); // Get information of the image uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(buffer); size_t width = CVPixelBufferGetWidth(buffer); size_t height = CVPixelBufferGetHeight(buffer); // Fill the texture glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, baseAddress); // Unlock the image buffer CVPixelBufferUnlockBaseAddress(buffer, 0); //CFRelease(sampleBuffer); CVBufferRelease(buffer); } }

Así que este código funciona bien con iOS 6 y me gustaría que funcione en iOS 5, pero AVPlayerItemVideoOutput no es parte de iOS 5, así que aún puedo reproducir el video, pero no sé cómo recuperar el buffer de píxeles para cada fotograma de el video.

¿Tiene una idea de lo que puedo usar en lugar de AVPlayerItemVideoOutput para recuperar el buffer de píxeles para cada cuadro del video? (debe funcionar con video local y remoto y también quiero reproducir la pista de audio).

Muchas gracias por su ayuda !