Bucle de un video en AVFoundation AVSampleBufferDisplayLayer

Estoy intentando reproducir un video en un bucle en un AVSampleBufferDisplayLayer. Puedo hacer que juegue una vez sin problemas. Pero, cuando trato de hacerlo, no sigue jugando.

Según la respuesta a AVFoundation para reproducir un ciclo de video, no hay una forma de rebobinar el AVAssetReader, así que lo vuelvo a crear. ( Ví la respuesta para Bucle de un video con AVFoundation AVPlayer? Pero AVPlayer es más funciones completas. Estoy leyendo para un file, pero quiero que el AVSampleBufferDisplayLayer siga en pie).

Una hipótesis es que necesito detener algunos de los encabezados H264, pero no tengo idea si eso ayudará (y cómo). Otra es que tiene algo que ver con CMTimebase, pero he intentado varias cosas sin ningún resultado.

Código a continuación, basado en la conversación WWDC de Apple sobre el acceso directo a la encoding de video:

- (void)viewDidLoad { [super viewDidLoad]; NSString *filepath = [[NSBundle mainBundle] pathForResource:@"sample-mp4" ofType:@"mp4"]; NSURL *fileURL = [NSURL fileURLWithPath:filepath]; AVAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil]; UIView *view = self.view; self.videoLayer = [[AVSampleBufferDisplayLayer alloc] init]; self.videoLayer.bounds = view.bounds; self.videoLayer.position = CGPointMake(CGRectGetMidX(view.bounds), CGRectGetMidY(view.bounds)); self.videoLayer.videoGravity = AVLayerVideoGravityResizeAspect; self.videoLayer.backgroundColor = [[UIColor greenColor] CGColor]; CMTimebaseRef controlTimebase; CMTimebaseCreateWithMasterClock( CFAllocatorGetDefault(), CMClockGetHostTimeClock(), &controlTimebase ); self.videoLayer.controlTimebase = controlTimebase; CMTimebaseSetTime(self.videoLayer.controlTimebase, CMTimeMake(5, 1)); CMTimebaseSetRate(self.videoLayer.controlTimebase, 1.0); [[view layer] addSublayer:_videoLayer]; dispatch_queue_t assetQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //??? right queue? __block AVAssetReader *assetReaderVideo = [self createAssetReader:asset]; __block AVAssetReaderTrackOutput *outVideo = [assetReaderVideo outputs][0]; if( [assetReaderVideo startReading] ) { [_videoLayer requestMediaDataWhenReadyOnQueue: assetQueue usingBlock: ^{ while( [_videoLayer isReadyForMoreMediaData] ) { CMSampleBufferRef sampleVideo; if ( ([assetReaderVideo status] == AVAssetReaderStatusReading) && ( sampleVideo = [outVideo copyNextSampleBuffer]) ) { [_videoLayer enqueueSampleBuffer:sampleVideo]; CFRelease(sampleVideo); CMTimeShow(CMTimebaseGetTime(_videoLayer.controlTimebase)); } else { [_videoLayer stopRequestingMediaData]; //CMTimebaseSetTime(_videoLayer.controlTimebase, CMTimeMake(5, 1)); //CMTimebaseSetRate(self.videoLayer.controlTimebase, 1.0); //CMTimeShow(CMTimebaseGetTime(_videoLayer.controlTimebase)); assetReaderVideo = [self createAssetReader:asset]; outVideo = [assetReaderVideo outputs][0]; [assetReaderVideo startReading]; //sampleVideo = [outVideo copyNextSampleBuffer]; //[_videoLayer enqueueSampleBuffer:sampleVideo]; } } }]; } } -(AVAssetReader *)createAssetReader:(AVAsset*)asset { NSError *error=nil; AVAssetReader *assetReaderVideo = [[AVAssetReader alloc] initWithAsset:asset error:&error]; NSArray *videoTracks = [asset tracksWithMediaType:AVMediaTypeVideo]; AVAssetReaderTrackOutput *outVideo = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:videoTracks[0] outputSettings:nil]; //dic]; [outVideo res] [assetReaderVideo addOutput:outVideo]; return assetReaderVideo; } 

Muchas gracias.

Intente realizar un ciclo con swift, luego puentee los files objective-c con los files rápidos. Google tiene muchas respuestas para puentear y hacer loops, así que simplemente google con rapidez.