2015-10-20 88 views
1

您好我只是在iOS 9中面临这个问题..我试图合并2个caf文件,并且所有在iOS 8中工作正常,但是当我在iOS 9上测试应用程序时不果然工作..只有一个文件播放时我玩最终合并的文件..任何形式的帮助将是appreciatedA在iOS 9中使用AVFoundation合并2个音频文件caf

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); 
      } 
     }]; 
+1

hello @muhammad你找到了你的问题的解决方案。因为我也面临这个问题。我正在制作一个修剪和合并音频文件的应用程序。但是当我在ios 9上运行应用程序时AVAssetExportSessionStatus总是失败请帮助,如果你解决了你的问题。 – Nitin

+0

@Nitin您是否从我的答案中找到解决方案? –

+0

是的,我找到解决方案..请在下面找到我已经添加它......如果工作..:D投票 – Nitin

回答

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

的NSArray *路径= 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); 
    } 
}]; 

用这个代替你的代码。

相关问题