2012-07-03 14 views
16

He intentado exportar archivos de audio desde el iPod-Library. Mi objetivo es crear un nuevo archivo en la carpeta de documentos de la aplicación con este archivo iPod-Library. No puede crear archivos solo para algunos elementos. A continuación está mi fragmento de código.AVAssetExport falla para algunos archivos

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 un error, como se muestra a continuación cuando trató con el bloque controlador de errores:

[exporter exportAsynchronouslyWithCompletionHandler:^{ 

    int exportStatus = exporter.status; 

    switch (exportStatus) { 

     case AVAssetExportSessionStatusFailed: { 

      NSError *exportError = exporter.error; 

      NSLog (@"AVAssetExportSessionStatusFailed: %@", exportError); 

      break; 
     } 
    } 
}]; 

AVAssetExportSessionStatusFailed: Error = Código de dominio AVFoundationErrorDomain = -11800 "La operación no se pudo completar" UserInfo = 0x214f20 {NSLocalizedFailureReason = Ocurrió un error desconocido (-12124), NSUnderlyingError = 0x218270 "La operación no pudo completarse. (OSStatus error -12124.)", NSLocalizedDescription = La operación no pudo completarse}

+0

¿Hay suficiente espacio para los archivos en el dispositivo? ¿También existen ya que estás tratando de exportarlos tal vez? –

Respuesta

0

Si tiene coincidencia de iTunes y el archivo no se descarga al dispositivo, esto puede suceder. ¿Puedes verificar si ese es el caso para ti? Si es así puedo dar 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; 
} 
0

He experimentado esto también. ¿Estás usando el partido de iTunes? Es posible que el archivo no esté en el dispositivo real. Puede verificar esto en AVAsset marcando las propiedades como hasProtectedContent o asegurando que exportable es YES.

Además, he notado 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 AVAssetExportPresetPassthrough`. Esto supone que está satisfecho con el formato de archivo existente, que tal vez .m4a, .mp3, .wav, etc. ...

0

La ruta del archivo de música que está utilizando podría ser incorrecta. Prueba este

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; 
     } 
    } 
    } 
]; 
} 
2

haber jugado mucho con esto mismo, algunas de las respuestas pueden ser relevantes y correcta. Otra cosa a tener en cuenta es que a menudo solía obtener errores similares AVFoundation si trataba de combinar videos que tenían diferentes tasas de fotogramas. Verifique la velocidad de fotogramas de los archivos fuente y verifique también los CMTime. Es posible que deba preprocesar algunos archivos antes de agregarlos a un AVMutableComposition.

Cuestiones relacionadas