2012-07-03 31 views
16

मैंने आईपॉड-लाइब्रेरी से ऑडियो फ़ाइल निर्यात करने का प्रयास किया है। मेरा उद्देश्य इस आईपॉड-लाइब्रेरी फ़ाइल के साथ ऐप दस्तावेज़ फ़ोल्डर में नई फ़ाइल बनाना है। यह केवल कुछ वस्तुओं के लिए फाइलें बनाने में विफल रहता है। नीचे मेरा कोड स्निपेट है।AVAssetExport कुछ फ़ाइलों के लिए विफल रहता है

[exporter exportAsynchronouslyWithCompletionHandler:^{ 

    int exportStatus = exporter.status; 

    switch (exportStatus) { 

     case AVAssetExportSessionStatusFailed: { 

      NSError *exportError = exporter.error; 

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

      break; 
     } 
    } 
}]; 

AVAssetExportSessionStatusFailed:

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; 

Am के रूप में जब त्रुटि हैंडलर ब्लॉक के साथ की कोशिश की नीचे दिखाया गया त्रुटि प्राप्त करने में त्रुटि डोमेन = AVFoundationErrorDomain कोड = -11,800 "कार्रवाई पूर्ण नहीं किया जा सका" UserInfo = 0x214f20 {NSLocalizedFailureReason = एक अज्ञात त्रुटि हुई (-12124), NSUnderlyingError = 0x218270 "ऑपरेशन पूरा नहीं हो सका। (OSStatus त्रुटि -12124।)", NSLocalizedDescription = ऑपरेशन पूरा नहीं हो सका}

+0

क्या डिवाइस पर फ़ाइलों के लिए पर्याप्त जगह है? क्या वे पहले से मौजूद हैं जहां आप उन्हें निर्यात करने की कोशिश कर रहे हैं? –

उत्तर

0

यदि आपके पास आईट्यून्स मैच है और फ़ाइल डिवाइस पर डाउनलोड नहीं की गई है, तो ऐसा हो सकता है। क्या आप यह देखने के लिए जांच सकते हैं कि यह आपके लिए मामला है या नहीं? यदि ऐसा है तो मैं इसे पहचानने के लिए कोड दे सकता हूं।

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

    return NO; 
} 
0

मैंने इसका अनुभव भी किया है। क्या आप आईट्यून्स मैच का उपयोग कर रहे हैं? यह हो सकता है कि फ़ाइल वास्तविक डिवाइस पर नहीं है। आप इसे hasProtectedContent जैसे गुणों की जांच करके या exportableYES सुनिश्चित करके AVAsset पर देख सकते हैं।

इसके अलावा, मुझे लगता है कि आप AVExportSession प्रीसेट AVAssetExportPresetAppleM4A'. This will re-encode the file you are exporting. It may be easier (and much faster) to just pass-though instead using AVAssetExportPresetPassthrough` का उपयोग कर रहे हैं। यह मानता है कि आप मौजूदा फ़ाइल प्रारूप से खुश हैं, जो शायद .m4a, .mp3, .wav आदि ...

0

आपके द्वारा उपयोग किए जा रहे संगीत फ़ाइल पथ गलत हो सकते हैं। इसे आजमाएं

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

इस के साथ बहुत कुछ खेला, कुछ जवाब प्रासंगिक और सही हो सकते हैं। एक और बात यह देखने के लिए है कि अलग-अलग फ्रेम-दर वाले वीडियो को गठबंधन करने का प्रयास करते समय मुझे अक्सर AVFoundation त्रुटियां मिलती थीं। स्रोत फ़ाइलों फ्रेम दर की जांच करें और अपने CMTime भी देखें। आपको AVMutableComposition में जोड़ने से पहले कुछ फ़ाइलों को प्री-प्रोसेस करना पड़ सकता है।

संबंधित मुद्दे