iOS 如何对音频、视频合成,配音、卡拉OK技术

iOS 如何对音频、视频合成,配音、卡拉OK技术

iOS原生的开发框架集成了丰富的视频/音频处理功能,所以用不着去找第三方框架。只要:

#import 

AVFoundation基本上能满足大部分的音频/视频处理。Talk is cheap,我们看看一个简单的例子。这个例子的功能是将一个视频的画面(不包括声音)和另外一段背景音合成,以说明音频/视频合成的基本用法。只要设置不同的位置,就可以随意地将不同的视频和音频进行合成,比如对电影配音,或者用伴奏音频和自己的声音进行混合,制作卡拉OK功能。

NSError *error = nil;
    AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:videoUrl options:nil];
    AVURLAsset *backgroundAudio = [[AVURLAsset alloc] initWithURL:bgmUrl options:nil];
    AVMutableComposition* mixComposition = [AVMutableComposition composition];

上面一段是初始化代码,AVURLAsset是一个资源的抽象类,由此可以分离出资源的音频和视频,也就是说,一个带音频的视频可以直接用这个对象得到它的音频和视频轨道来进行处理。
AVMutableComposition顾名思义是一个用来接收不同轨道的类,无论是音频还是视频。那我们开始把相应音频和视频放到AVMutableComposition去吧。


    AVMutableCompositionTrack *backgroundTrack =
    [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio
                           preferredTrackID:kCMPersistentTrackID_Invalid];

    NSArray *audioTracks = [backgroundAudio tracksWithMediaType:AVMediaTypeAudio];
    [backgroundTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, backgroundAudio.duration)
                                        ofTrack:[audioTracks firstObject]
                                         atTime:kCMTimeZero error:nil];


    AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo
                                                                                   preferredTrackID:kCMPersistentTrackID_Invalid];
    NSArray *videoTracks = [videoAsset tracksWithMediaType:AVMediaTypeVideo];
    [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration)
                                   ofTrack:[videoTracks firstObject]
                                    atTime:kCMTimeZero error:nil];

一般来说videoTracks只有一个音轨/视轨,我这里简单地把开始时间都设为0,长度设为他们的时长。如果你还想添加别的音频/视频,只要继续使用mixComposition addMutableTrackWithMediaType:,在合成的媒体设置不同的位置即可。
设置好了合成的素材之后,下面我们就开始输出了,这一段代码比较固定。

    if ([[NSFileManager defaultManager] fileExistsAtPath:location.path])
    {
        [[NSFileManager defaultManager] removeItemAtPath:location.path error:&error];
        if (error) {
            failed();
            return;
        }
    }

    for (NSString *supportFileType in assetExport.supportedFileTypes) {
        NSLog(@"%@",supportFileType);
    }

    assetExport.outputFileType = @"public.mpeg-4";
    NSLog(@"file type %@",assetExport.outputFileType);
    assetExport.outputURL = location;
    assetExport.shouldOptimizeForNetworkUse = YES;

    [assetExport exportAsynchronouslyWithCompletionHandler:
     ^(void ) {
         // your completion code here
         NSLog(@"%@",assetExport.outputURL);

     }
     ];

其中,我打印了supportFileType,以看到有哪些格式是支持的,iOS对MP4支持比较严格,视频里面的音频必须要用AAC来编码的,另外说一句,这些无论是合成的视频,音频,还是合成后的视频,它都是用NSURL的,也就是说,合成的功能支持纯网络环境运行。
这是我第一次认真写技术博客,转载请注明出处,谢谢。

你可能感兴趣的:(iOS)