在iOS 9中使用AVFoundation合并2个音频文件caf

时间:2015-10-20 12:20:48

标签: ios audio avfoundation

您好我刚刚在iOS 9中遇到此问题..我正在尝试合并2个caf文件,所有在iOS 8中工作正常但是当我在iOS 9上测试应用程序时,它无法正常工作..只播放了一个文件当我玩最终合并文件时...任何形式的帮助将被赞赏A

AVMutableComposition *composition = [[AVMutableComposition alloc] init];

        AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
        [compositionAudioTrack setPreferredVolume:1.0];
        NSURL *url = [NSURL fileURLWithPath:[url3 path]];
        AVAsset *avAsset = [AVURLAsset URLAssetWithURL:url options:nil];
        AVAssetTrack *clipAudioTrack = [[avAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
        [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration) ofTrack:clipAudioTrack atTime:kCMTimeZero error:nil];

        AVMutableCompositionTrack *compositionAudioTrack1 = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
        [compositionAudioTrack1 setPreferredVolume:1.0];
        NSURL *url1 = [NSURL fileURLWithPath:[url12 path]];
        AVAsset *avAsset1 = [AVURLAsset URLAssetWithURL:url1 options:nil];
        AVAssetTrack *clipAudioTrack1 = [[avAsset1 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
        [compositionAudioTrack1 insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset1.duration) ofTrack:clipAudioTrack1 atTime:kCMTimeZero error:nil];

        AVAssetExportSession *exportSession = [AVAssetExportSession
                                               exportSessionWithAsset:composition
                                               presetName:AVAssetExportPresetAppleM4A];

        //NSLog(@"Output file path - %@",soundOneNew);

        // configure export session  output with all our parameters
        exportSession.outputURL = [NSURL fileURLWithPath:soundOneNew]; // output path
        exportSession.outputFileType = AVFileTypeAppleM4A; // output file type
        // perform the export

        NSLog(@"AVAssetExportSessionStatusCompleted");

        [exportSession exportAsynchronouslyWithCompletionHandler:^{

            if (AVAssetExportSessionStatusCompleted == exportSession.status) {
                NSData *newAudiofound = [NSData dataWithContentsOfURL:exportSession.outputURL];
                [newAudiofound writeToFile:[finalURLAudio path] atomically:YES];
                [self playAudio:exportSession.outputURL];

            } else if (AVAssetExportSessionStatusFailed == exportSession.status) {
                // a failure may happen because of an event out of your control
                // for example, an interruption like a phone call comming in
                // make sure and handle this case appropriately
                NSLog(@"AVAssetExportSessionStatusFailed");
            } else {
                NSLog(@"Export Session Status: %d", exportSession.status);
            }
        }];

2 个答案:

答案 0 :(得分:0)

-(void)mergesound{


    NSURL *audio_url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"1" ofType:@"m4a"]];

    AVMutableComposition *composition = [[AVMutableComposition alloc] init];

    CMTime currentTime = kCMTimeZero;


    AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    [compositionAudioTrack setPreferredVolume:1.0];

    AVAsset *avAsset = [AVURLAsset URLAssetWithURL:audio_url options:nil];
    AVAssetTrack *clipAudioTrack = [[avAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration) ofTrack:clipAudioTrack atTime:kCMTimeZero error:nil];


    AVAsset *avAsset1 = [AVURLAsset URLAssetWithURL:audio_url options:nil];
    AVAssetTrack *clipAudioTrack1 = [[avAsset1 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];


     currentTime = CMTimeAdd(currentTime, avAsset.duration);


    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset1.duration) ofTrack:clipAudioTrack1 atTime:currentTime error:nil];

    AVAssetExportSession *exportSession = [AVAssetExportSession
                                           exportSessionWithAsset:composition
                                           presetName:AVAssetExportPresetAppleM4A];

    NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docsDir = [dirPaths objectAtIndex:0];
    NSString *outputFilePath = [docsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"FinalVideo.m4a"]];

    if ([[NSFileManager defaultManager] fileExistsAtPath:outputFilePath])
        [[NSFileManager defaultManager] removeItemAtPath:outputFilePath error:nil];

    exportSession.outputURL = [NSURL fileURLWithPath:outputFilePath]; // output path
    exportSession.outputFileType = AVFileTypeAppleM4A; // output file type
    // perform the export

    NSLog(@"AVAssetExportSessionStatusCompleted");

    [exportSession exportAsynchronouslyWithCompletionHandler:^{

        if (AVAssetExportSessionStatusCompleted == exportSession.status)
        {
            NSData *newAudiofound = [NSData dataWithContentsOfURL:exportSession.outputURL];
            [newAudiofound writeToFile:outputFilePath atomically:YES];
          //  [self playAudio:exportSession.outputURL];

        } else if (AVAssetExportSessionStatusFailed == exportSession.status) {
            // a failure may happen because of an event out of your control
            // for example, an interruption like a phone call comming in
            // make sure and handle this case appropriately
            NSLog(@"AVAssetExportSessionStatusFailed");
        } else {
            NSLog(@"Export Session Status: %d", exportSession.status);
        }
    }];
}

答案 1 :(得分:0)

NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);     NSString * documentsDirectory = [paths objectAtIndex:0];

NSString *path1;
NSString *path2;

path1 = [NSString stringWithFormat:@"%@/firstPart.caf",documentsDirectory];
path2 = [NSString stringWithFormat:@"%@/newRecording.caf",documentsDirectory];

AVAsset *avAsset1 = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:path1] options:nil];
AVAsset *avAsset2 = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:path2] options:nil];

AVMutableComposition *composition = [[AVMutableComposition alloc] init];
if (version < 9.0) {
    [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
}
AVMutableCompositionTrack *track = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

AVAssetTrack *assetTrack1;
AVAssetTrack *assetTrack2;

if ([avAsset1 tracksWithMediaType:AVMediaTypeAudio].count > 0) {
    assetTrack1 = [[avAsset1 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
    assetTrack2 = [[avAsset2 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
}

CMTime insertionPoint = kCMTimeZero;

[track insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset1.duration) ofTrack:assetTrack1 atTime:insertionPoint error:nil];
insertionPoint = CMTimeAdd(insertionPoint, avAsset1.duration);
[track insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset2.duration) ofTrack:assetTrack2 atTime:insertionPoint error:nil];

NSURL *outPutUrl = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/mergedFilePart1.caf",documentsDirectory]];

AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:composition presetName:AVAssetExportPresetAppleM4A];

exportSession.outputURL = outPutUrl;

exportSession.outputFileType = AVFileTypeAppleM4A;

[exportSession exportAsynchronouslyWithCompletionHandler:^{
    if (AVAssetExportSessionStatusCompleted == exportSession.status) {

        NSLog(@"AVAssetExportSessionStatusCompleted");
        [self mergeAudioPart2];

    }
    else if (AVAssetExportSessionStatusFailed == exportSession.status)
    {

        NSLog(@"%ld",(long)exportSession.status);
        NSLog(@"AVAssetExportSessionStatusFailed");
    }
    else
    {
        NSLog(@"Export Session Status: %ld", (long)exportSession.status);
    }
}];

用这个代替你的代码。