美文网首页
IOS 音频合成

IOS 音频合成

作者: 灰斗儿 | 来源:发表于2016-11-28 11:22 被阅读172次
    - (void) setUpAndAddAudioAtPath:(NSURL*)assetURL toComposition:(AVMutableComposition *)composition start:(CMTime)start dura:(CMTime)dura offset:(CMTime)offset{
        AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:assetURL options:nil];  
        
        AVMutableCompositionTrack *track = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
        AVAssetTrack *sourceAudioTrack = [[songAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
        
        NSError *error = nil;
        BOOL ok = NO;
        
        CMTime startTime = start;
        CMTime trackDuration = dura;
        CMTimeRange tRange = CMTimeRangeMake(startTime, trackDuration);
        
        //Set Volume
        AVMutableAudioMixInputParameters *trackMix = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track];
        [trackMix setVolume:0.8f atTime:startTime];
        [audioMixParams addObject:trackMix];
        
        //Insert audio into track  //offset CMTimeMake(0, 44100)
        ok = [track insertTimeRange:tRange ofTrack:sourceAudioTrack atTime:offset error:&error];
    }
    - (void) exportAudio {
        
        AVMutableComposition *composition = [AVMutableComposition composition];
        audioMixParams = [[NSMutableArray alloc] initWithObjects:nil];
        
        //Add Audio Tracks to Composition
        NSString *path = [[NSBundle mainBundle] pathForResource:@"recordedFile" ofType:@"caf"];
        NSURL *assetURL1 = [NSURL fileURLWithPath:path];
        
        AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:assetURL1 options:nil];  
        CMTime startTime = CMTimeMakeWithSeconds(0, 1);
        CMTime trackDuration = songAsset.duration;
        
        [self setUpAndAddAudioAtPath:assetURL1 toComposition:composition start:startTime dura:trackDuration offset:CMTimeMake(14*44100, 44100)];
        
        path = [[NSBundle mainBundle] pathForResource:@"1286" ofType:@"mp3"];
        NSURL *assetURL2 = [NSURL fileURLWithPath:path];
        [self setUpAndAddAudioAtPath:assetURL2 toComposition:composition start:startTime dura:trackDuration offset:CMTimeMake(0, 44100)];
        
        AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
        audioMix.inputParameters = [NSArray arrayWithArray:audioMixParams];
        
        //If you need to query what formats you can export to, here's a way to find out
        NSLog (@"compatible presets for songAsset: %@",
               [AVAssetExportSession exportPresetsCompatibleWithAsset:composition]);
        
        AVAssetExportSession *exporter = [[AVAssetExportSession alloc]
                                          initWithAsset: composition
                                          presetName: AVAssetExportPresetAppleM4A];
        exporter.audioMix = audioMix;
        exporter.outputFileType = @"com.apple.m4a-audio";
        NSString *fileName = @"someFilename";
        NSString *exportFile = [NSHomeDirectory() stringByAppendingFormat: @"/%@.m4a", fileName];    
        
        // set up export 
        if ([[NSFileManager defaultManager] fileExistsAtPath:exportFile]) {
            [[NSFileManager defaultManager] removeItemAtPath:exportFile error:nil];
        }
        NSURL *exportURL = [NSURL fileURLWithPath:exportFile];
        exporter.outputURL = exportURL; 
        
        // do the export
        [exporter exportAsynchronouslyWithCompletionHandler:^{
            int exportStatus = exporter.status;
            switch (exportStatus) {
                case AVAssetExportSessionStatusFailed:{
                    NSError *exportError = exporter.error;
                    NSLog (@"AVAssetExportSessionStatusFailed: %@", exportError);
                    break;
                }
                    
                case AVAssetExportSessionStatusCompleted: NSLog (@"AVAssetExportSessionStatusCompleted"); break;
                case AVAssetExportSessionStatusUnknown: NSLog (@"AVAssetExportSessionStatusUnknown"); break;
                case AVAssetExportSessionStatusExporting: NSLog (@"AVAssetExportSessionStatusExporting"); break;
                case AVAssetExportSessionStatusCancelled: NSLog (@"AVAssetExportSessionStatusCancelled"); break;
                case AVAssetExportSessionStatusWaiting: NSLog (@"AVAssetExportSessionStatusWaiting"); break;
                default:  NSLog (@"didn't get export status"); break;
            }
        }];
        
    //    // start up the export progress bar
    //    progressView.hidden = NO;
    //    progressView.progress = 0.0;
    //    [NSTimer scheduledTimerWithTimeInterval:0.1
    //                                     target:self
    //                                   selector:@selector (updateExportProgress:)
    //                                   userInfo:exporter
    //                                    repeats:YES];
        
    }
    

    相关文章

      网友评论

          本文标题:IOS 音频合成

          本文链接:https://www.haomeiwen.com/subject/dwhopttx.html