2013-02-01 23 views
7

Tôi đang cố hợp nhất một số tệp âm thanh (được chọn qua MPMediaPickerController), nhưng việc xuất luôn không thành công với mã lỗi -12780.AVAssetExportSession không thành công mỗi lần (lỗi -12780)

Khi tôi cố gắng phát sáng tác phẩm của mình bằng đối tượng AVPlayer, nó phát chính xác. Chỉ xuất không thành công.

Tôi đang làm gì sai?

Đây là mã của tôi:

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

Trả lời

16

Cần thay đổi URL xuất khẩu của bạn để:

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

Bạn phải sử dụng fileURLWithPath khi đề cập đến tập tin đường dẫn. Tôi đã bị treo cổ bởi điều này cho đến khi tôi đọc điều này: AVAssetExportSession outputfile

+0

cảm ơn. Tôi đã gần như mất đi những gì còn lại của sự tỉnh táo của tôi! – GreatWiz

+0

đã lưu ngày của tôi ... cảm ơn +1 – Vats

+0

omg, bạn đã cứu mạng tôi. Cảm ơn nhiều! – Tien

Các vấn đề liên quan