2013-02-01 13 views
7

Próbuję połączyć niektóre pliki audio (wybrane przez MPMediaPickerController), ale eksport zawsze kończy się niepowodzeniem z kodem błędu -12780.AVAssetExportSession nie powiedzie się za każdym razem (błąd -12780)

Kiedy próbuję odtworzyć moją kompozycję przy pomocy obiektu AVPlayer, gra ona poprawnie. Tylko eksport nie powiedzie się.

Co robię źle?

To jest mój kod:

AVAssetExportSession *exportSession; 
AVPlayer *player; 

- (void)mergeAudiofiles { 
    // self.mediaItems is an NSArray of MPMediaItems 
    if (self.mediaItems.count == 0) { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" 
                 message:@"No Tracks selected." 
                 delegate:nil 
               cancelButtonTitle:@"OK" 
               otherButtonTitles:nil]; 
     [alert show]; 
     return; 
    } 

    // Configure audio session 
    NSError *sessionError; 
    AVAudioSession *session = [AVAudioSession sharedInstance]; 
    [session setCategory:AVAudioSessionCategoryAudioProcessing error:nil]; 
    [session setActive:YES error:&sessionError]; 
    if (sessionError) NSLog(@"Session-Error: %@", sessionError.localizedDescription); 

    // Create composition 
    AVMutableComposition *composition = [AVMutableComposition composition]; 
    AVMutableCompositionTrack *track = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
    CMTime position = kCMTimeZero; 

    for (MPMediaItem *item in self.mediaItems) { 
     NSURL *assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL]; 
     AVAsset *asset = [AVAsset assetWithURL:assetURL]; 

     CMTimeRange duration = CMTimeRangeMake(kCMTimeZero, asset.duration); 
     //  duration = CMTimeRangeMake(kCMTimeZero, CMTimeMake(5, 1)); // For player test 

     NSError *error; 
     [track insertTimeRange:duration ofTrack:[[asset tracksWithMediaType:AVMediaTypeAudio] lastObject] atTime:position error:&error]; 
     if (error) NSLog(@"ERROR! :("); 

     position = CMTimeAdd(position, duration.duration); 
    } 

    // Path to output file 
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
    NSURL *exportUrl = [NSURL URLWithString:[documentsDirectory stringByAppendingPathComponent:@"export.m4a"]]; 

    NSLog(@"Export URL = %@", exportUrl.description); 

    // Playing works! 
    // """""""""""""" 
    // AVPlayerItem *pitem = [[AVPlayerItem alloc] initWithAsset:composition]; 
    // player = [[AVPlayer alloc] initWithPlayerItem:pitem]; 
    // [player play]; 
    // 
    // return; 

    // Export 
    exportSession = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetAppleM4A]; 
    exportSession.outputURL = exportUrl; 
    exportSession.outputFileType = AVFileTypeAppleM4A; 

    [exportSession exportAsynchronouslyWithCompletionHandler:^{ 
     switch (exportSession.status) { 
      case AVAssetExportSessionStatusFailed: 
       NSLog(@"Export failed -> Reason: %@, User Info: %@", 
         exportSession.error.localizedDescription, 
         exportSession.error.userInfo.description); 
       break; 

      case AVAssetExportSessionStatusCancelled: 
       NSLog(@"Export cancelled"); 
       break; 

      case AVAssetExportSessionStatusCompleted: 
       NSLog(@"Export finished"); 
       break; 

      default: 
       break; 
     } 
    }]; 
} 

Odpowiedz

16

Konieczność zmiany adresu URL na eksport do:

NSURL *exportUrl = [NSURL fileURLWithPath:[documentsDirectory stringByAppendingPathComponent:@"export.m4a"]]; 

Musisz użyć fileURLWithPath w odniesieniu do plików ścieżki. Rozłączyłem się z tym również, dopóki nie przeczytałem tego: AVAssetExportSession outputfile

+0

dziękuję. Byłem bliski utraty tego, co remasy mojej zdrowej psychiki! – GreatWiz

+0

uratowałem mój dzień ... dzięki +1 – Vats

+0

omg, uratowałeś mi życie. Dziękuję Ci bardzo! – Tien

Powiązane problemy