Caché con AVPlayer y AVAssetExportSession

Me gustaría almacenar en caching los videos de descarga progresiva con AVPlayer. ¿Cómo puedo save un elemento de AVPlayer en el disco? Estoy intentando usar AVAssetExportSession en el elemento actual del jugador (que está completamente cargado). Este código me está dando " AVAssetExportSessionStatusFailed (La operación no se pudo completar) ":

AVAsset *mediaAsset = self.player.currentItem.asset; AVAssetExportSession *es = [[AVAssetExportSession alloc] initWithAsset:mediaAsset presetName:AVAssetExportPresetLowQuality]; NSString *outPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"out.mp4"]; NSFileManager *fileManager = [NSFileManager defaultManager]; [fileManager removeItemAtPath:outPath error:NULL]; es.outputFileType = @"com.apple.quicktime-movie"; es.outputURL = [[[NSURL alloc] initFileURLWithPath:outPath] autorelease]; NSLog(@"exporting to %@",outPath); [es exportAsynchronouslyWithCompletionHandler:^{ NSString *status = @""; if( es.status == AVAssetExportSessionStatusUnknown ) status = @"AVAssetExportSessionStatusUnknown"; else if( es.status == AVAssetExportSessionStatusWaiting ) status = @"AVAssetExportSessionStatusWaiting"; else if( es.status == AVAssetExportSessionStatusExporting ) status = @"AVAssetExportSessionStatusExporting"; else if( es.status == AVAssetExportSessionStatusCompleted ) status = @"AVAssetExportSessionStatusCompleted"; else if( es.status == AVAssetExportSessionStatusFailed ) status = @"AVAssetExportSessionStatusFailed"; else if( es.status == AVAssetExportSessionStatusCancelled ) status = @"AVAssetExportSessionStatusCancelled"; NSLog(@"done exporting to %@ status %d = %@ (%@)",outPath,es.status, status,[[es error] localizedDescription]); }]; 

¿Cómo puedo exportar con éxito? Estoy tratando de copyr mediaAsset en una AVMutableComposition, pero tampoco he tenido mucha suerte con eso.

¡Gracias!

PD: Aquí hay algunas preguntas de personas que intentan lograr lo mismo (pero con MPMoviePlayerController):

  • Contenido descargado progresivo de caching en MPMoviePlayerController

  • ¿Al mismo time transmitir y save un video?

  • Almacenamiento en caching de videos en el disco después de una precarga exitosa por MPMoviePlayerController

Aún no estoy usando el SDK de iOS 4.3, pero tengo curiosidad de conocer el valor de mediaAsset.exportable en 4.3, como se describe aquí:

http://developer.apple.com/library/ios/#releasenotes/AudioVideo/RN-AVFoundation/_index.html#//apple_ref/doc/uid/TP40010717-CH1-SW4

He intentado una serie de modificaciones en su código, como get el nombre y el tipo de file preestablecidos de la list de los disponibles, pero estoy recibiendo el mismo error que usted.

Por lo tanto, decidí probar un marco de menor nivel, ya que la documentation indica que puede conectar un AVAssetReader y un AVAssetWriter para get el mismo efecto que AVAssetExportSession excepto con más control. Sin embargo, el siguiente código:

 NSError *readerError = nil; AVAssetReader *reader = [AVAssetReader assetReaderWithAsset:mediaAsset error:&readerError]; if (readerError) NSLog(@"Error instantiating asset reader: %@", [readerError localizedDescription]); 

Da el siguiente resultado:

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVAssetReader initWithAsset:error:] Cannot initialize an instance of AVAssetReader with an asset at non-local URL 'http://example.com/test.mp3'' 

Tenga en count que he probado esto con una URL de trabajo pero la he reemplazado con una falsa arriba. Esto me parece que iOS no es compatible con la funcionalidad que estamos buscando. Por todo lo que sé AVAssetExportSession utiliza un AVAssetReader bajo el capó y solo informa un error mucho less descriptivo cuando falla. Seguro que sería bueno si simplemente lo documentaran como tal. Los documentos para AVAssetExportSession no mencionan nada sobre el activo que necesita ser local:

http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAssetExportSession_Class/Reference/Reference.html#//apple_ref/occ/cl/AVAssetExportSession

Sé que esto no es una gran respuesta, pero mueve la investigación un poco por el path. Sigo esperando realmente que haya alguna forma de hacerlo, porque claramente no estamos solos en desear la function.

Seguro que no funciona en iOS 4.X. ¿Alguien ha intentado que funcione en iOS 5 Beta?

Parece ser un feto perdido. En la documentation no se indica que no admita el acceso a datos para medios en networking. Incluso los posts de error y otras cosas en API son extraños y parecen estar incompletos, al tratar de ejecutarlo. Lo más probable es que sea compatible pronto.