AVAssetExport falla para algunos files

Intenté exportar el file de audio de la iPod-Library. Mi objective es crear un nuevo file en la carpeta de documentos de la aplicación con este file de iPod-Library. No puede crear files solo para algunos elementos. A continuación se muestra mi fragment de código.

AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL: url options:nil]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset: songAsset presetName: AVAssetExportPresetAppleM4A]; exporter.outputFileType = @"com.apple.m4a-audio"; NSString *songName = [filename stringByAppendingString:@".m4a"]; NSString *musicfilepath = [documentsDirectory stringByAppendingPathComponent:@"musics/"]; [[NSFileManager defaultManager] createDirectoryAtPath:musicfilepath withIntermediateDirectories:YES attributes:nil error:nil]; NSString *exportFile = [musicfilepath stringByAppendingPathComponent:songName]; NSError *error1; if([[NSFileManager defaultManager] fileExistsAtPath:exportFile]) { [[NSFileManager defaultManager] removeItemAtPath:exportFile error:&error1]; } NSURL* exportURL = [[NSURL fileURLWithPath:exportFile] retain]; exporter.outputURL = exportURL; 

Estoy recibiendo el error como se muestra a continuación cuando se testing con el bloque controller de errores:

  [exporter exportAsynchronouslyWithCompletionHandler:^{ int exportStatus = exporter.status; switch (exportStatus) { case AVAssetExportSessionStatusFailed: { NSError *exportError = exporter.error; NSLog (@"AVAssetExportSessionStatusFailed: %@", exportError); break; } } }]; 

AVAssetExportSessionStatusFailed: Error Domain = AVFoundationErrorDomain Code = -11800 "La operación no se pudo completar" UserInfo = 0x214f20 {NSLocalizedFailureReason = Se produjo un error desconocido (-12124), NSUnderlyingError = 0x218270 "La operación no se pudo completar. (Error de estado -12124 .) ", NSLocalizedDescription = La operación no se pudo completar}

Habiendo jugado mucho con esto yo mismo, algunas de las respuestas pueden ser relevantes y correctas. Otra cosa a tener en count es que a menudo solía get errores de AVFoundation similares si intentaba combinar videos que tenían diferentes velocidades de fotogtwigs. Compruebe la velocidad de fotogtwigs de los files fuente y compruebe también su CMTime . Es posible que deba procesar previamente algunos files antes de agregarlos a una AVMutableComposition .

Si tienes coincidencia con iTunes y el file no se descarga en el dispositivo, esto puede suceder. ¿Puedes revisar para ver si ese es el caso para ti? Si es así, puedo dar un código para detectarlo.

 + (BOOL)isDownloadedFromiCloud:(MPMediaItem *)item { if ([item valueForProperty:MPMediaItemPropertyAssetURL] != nil) { AVURLAsset *asset = [AVURLAsset assetWithURL:[item valueForProperty:MPMediaItemPropertyAssetURL]]; if (asset.exportable) return YES; } return NO; } 

También he experimentado esto. ¿Estás usando iTunes match? Puede ser que el file no esté en el dispositivo real. Puede verificar esto en AVAsset comprobando las properties como hasProtectedContent o asegurándose de que exportable sea YES .

Además, noto que está utilizando el AVExportSession preset AVAssetExportPresetAppleM4A'. This will re-encode the file you are exporting. It may be easier (and much faster) to just pass-though instead using AVAssetExportPresetAppleM4A'. This will re-encode the file you are exporting. It may be easier (and much faster) to just pass-though instead using AVAssetExportPresetAppleM4A'. This will re-encode the file you are exporting. It may be easier (and much faster) to just pass-though instead using AVAssetExportPresetPassthrough`. Esto supone que está satisfecho con el formatting de file existente, que tal vez .m4a, .mp3, .wav, etc.

La ruta del file de música que está utilizando puede ser incorrecta. Prueba esto

 NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString* documentsDirectory = [paths objectAtIndex:0]; documentsDirectory = [documentsDirectory stringByAppendingPathComponent:@"Music"]; NSError* error; if (![[NSFileManager defaultManager] fileExistsAtPath:documentsDirectory]) [[NSFileManager defaultManager] createDirectoryAtPath:documentsDirectory withIntermediateDirectories:NO attributes:nil error:&error]; NSString *exportFile = [documentsDirectory stringByAppendingPathComponent:songName]; if([[NSFileManager defaultManager] fileExistsAtPath:exportFile]) { [[NSFileManager defaultManager] removeItemAtPath:exportFile error:&error1]; } if (error != nil) { NSURL* exportURL = [[NSURL fileURLWithPath:exportFile] retain]; exporter.outputURL = exportURL; [exporter exportAsynchronouslyWithCompletionHandler:^{ int exportStatus = exporter.status; switch (exportStatus) { case AVAssetExportSessionStatusFailed: { NSError *exportError = exporter.error; NSLog (@"AVAssetExportSessionStatusFailed: %@", exportError); break; } } } ]; }