iOS音频合成

可以传网络连接进行合成

/**
 *  合并两段音频
 * 
 *  @param url              主音乐路径
 *  @param accompanimentUrl 背景音乐路径
 *  @param success          成功后回调
 *  @param failure          失败后回调
 */
-(void)audio:(NSURL *)url AndAccompaniment:(NSURL *)accompanimentUrl isSuccess:(void (^)(NSString *outPath))success failure:(void (^)())failure{
    //创建AVAsset
    AVURLAsset *audioAsset = [AVURLAsset assetWithURL:url];
    AVURLAsset *accompanimentAsset = [AVURLAsset assetWithURL:accompanimentUrl];
    AVMutableComposition *compostion = [AVMutableComposition composition];
    AVMutableCompositionTrack *audio = [compostion addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:0];
    [audio insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration) ofTrack:[audioAsset tracksWithMediaType:AVMediaTypeAudio].firstObject atTime:kCMTimeZero error:nil];
    AVMutableCompositionTrack *accompaniment = [compostion addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:0];
    [accompaniment insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration) ofTrack:[accompanimentAsset tracksWithMediaType:AVMediaTypeAudio].firstObject atTime:kCMTimeZero error:nil];//背景音频长度,以主音频长度为准audioAsset.duration
    
    AVAssetExportSession *session = [[AVAssetExportSession alloc]initWithAsset:compostion presetName:AVAssetExportPresetAppleM4A];
    //输出路径
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *outPutFilePath = [NSString stringWithFormat:@"%@/audio.m4a",[paths lastObject]];
    if ([[NSFileManager defaultManager] fileExistsAtPath:outPutFilePath])
    {
        [[NSFileManager defaultManager] removeItemAtPath:outPutFilePath error:nil];
    }
    session.outputURL = [NSURL fileURLWithPath:outPutFilePath];
    session.outputFileType = @"com.apple.m4a-audio";
    session.shouldOptimizeForNetworkUse = YES;
    [session exportAsynchronouslyWithCompletionHandler:^{
        if ([[NSFileManager defaultManager] fileExistsAtPath:outPutFilePath])
        {
            // 成功调用
         /*注意,此处如果处理UI需要回主线程*/
            dispatch_async(dispatch_get_main_queue(), ^{
                success(outPutFilePath);
            });
            
        }
        else
        {   //失败调用
            dispatch_async(dispatch_get_main_queue(), ^{
                failure();
            });
        }
    }];

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS 音频拼接 简单使用 简单音频拼接介绍: http://www.cocoachina.com/ios/201...
    Da雪山阅读 5,654评论 1 5
  • 灰斗儿阅读 573评论 0 0
  • 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会到今年的就...
    iOS_Alex阅读 1,630评论 1 24
  • 世界上 最遥远的事情 不是彼此之间 无法联系 而是联系得到 却无法再次 同窗共读 世界上 最遥远的事情 不是我不想...
    轻倚岁月阅读 536评论 1 1
  • 确切地说,这不是一场真正意义上的爱情。但她把它当成爱情,这是一个仅属于她的爱情故事...... 1、 她去找他了,...
    蓝柿阅读 550评论 5 3