AVAssetExportSession每次都失败(错误-12780)

时间:2013-02-01 16:20:50

标签: ios avfoundation avassetexportsession

我正在尝试合并一些音频文件(通过MPMediaPickerController选取),但导出始终失败,错误代码为-12780。

当我尝试使用AVPlayer对象播放我的合成时,它会正常播放。 只是出口失败了。

我做错了什么?

这是我的代码:

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

1 个答案:

答案 0 :(得分:18)

需要将导出网址更改为:

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

引用文件路径时必须使用fileURLWithPath。我也被这个挂了,直到我读到这个:AVAssetExportSession outputfile