2012-07-03 22 views
16

Ho provato a esportare il file audio dall'iPod-Library. Il mio obiettivo è creare un nuovo file nella cartella Documenti dell'app con questo file di iPod-Library. Non riesce a creare file solo per alcuni elementi. Di seguito è riportato il mio snippet di codice.AVAssetExport non riesce per alcuni file

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; 

sto ottenendo errore come mostrato di seguito quando provato con il blocco di gestore di errore:

[exporter exportAsynchronouslyWithCompletionHandler:^{ 

    int exportStatus = exporter.status; 

    switch (exportStatus) { 

     case AVAssetExportSessionStatusFailed: { 

      NSError *exportError = exporter.error; 

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

      break; 
     } 
    } 
}]; 

AVAssetExportSessionStatusFailed: errore di dominio = Codice AVFoundationErrorDomain = -11.800 "L'operazione non ha potuto essere completato" UserInfo = 0x214f20 {NSLocalizedFailureReason = Si è verificato un errore sconosciuto (-12124), NSUnderlyingError = 0x218270 "Impossibile completare l'operazione. (OSStatus error -12124.)", NSLocalizedDescription = Impossibile completare l'operazione}

+0

C'è abbastanza spazio per i file sul dispositivo? Inoltre esistono già dove stai cercando di esportarli forse? –

risposta

0

Se la corrispondenza di iTunes è attiva e il file non viene scaricato sul dispositivo, ciò può accadere. Puoi verificare se questo è il tuo caso? Se è così posso dare il codice per rilevarlo.

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

    return NO; 
} 
0

Ho sperimentato anche questo. Stai usando la partita di iTunes? Potrebbe essere che il file non si trovi sul dispositivo reale. Puoi controllare questo su AVAsset controllando le proprietà come hasProtectedContent o assicurando che exportable sia YES.

Inoltre, noto che si sta utilizzando la preimpostazione AVExportSessionAVAssetExportPresetAppleM4A'. This will re-encode the file you are exporting. It may be easier (and much faster) to just pass-though instead using AVAssetExportPresetPassthrough`. Questo presuppone che tu sia soddisfatto del formato di file esistente, che potrebbe essere .m4a, .mp3, .wav ecc ...

0

Il percorso del file musicale che stai utilizzando potrebbe essere sbagliato. Prova questo

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

Avendo giocato molto con questo io stesso, alcune delle risposte potrebbero essere pertinenti e corrette. Un'altra cosa a cui prestare attenzione è che spesso mi sono ripetuto errori simili a AVFoundation se cercavo di combinare video con frame rate differenti. Controlla la frequenza fotogrammi dei file di origine e controlla anche i tuoi CMTime. Potrebbe essere necessario pre-elaborare alcuni file prima di aggiungerli in un AVMutableComposition.

Problemi correlati