iOS视频编辑之添加音轨的方法

2020-01-21 03:31:21王冬梅

2 声明并实例化音视频处理的核心类


@property (nonatomic, readwrite, strong) AVMutableComposition *composition;
@property (nonatomic, readwrite, strong) AVMutableVideoComposition *videoComposition;
@property (nonatomic, readwrite, strong) AVMutableAudioMix *audioMix;
AVMutableComposition *composition = [AVMutableComposition composition];
AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];

3 创建1条视频处理轨道以及2条音频处理轨道(视频原声+添加的音乐这俩条音轨)


AVMutableCompositionTrack *compositionVideoTracks = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
AVMutableCompositionTrack *compositionAudioTracks[2];
compositionAudioTracks[0] = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
compositionAudioTracks[1] = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

4 根据之前创建好的视频以及音频资源(AVURLAsset)实例化一条视频轨道以及2条音频轨道


AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
[compositionVideoTracks insertTimeRange:self.videoTimeRange ofTrack:videoTrack atTime:kCMTimeZero error:&error];
    
AVAssetTrack *audioTrack = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
[_comTrack1 insertTimeRange:self.videoTimeRange ofTrack:audioTrack atTime:kCMTimeZero error:&error];
    
AVAssetTrack *musicTrack = [[self.musicAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
[_comTrack2 insertTimeRange:self.videoTimeRange ofTrack:musicTrack atTime:kCMTimeZero error:&error];

5 配置AVMutableAudioMix参数,注意这里的trackID一定得是上面创建的AVMutableCompositionTrack对应的trackID,而不是AVAssetTrack中的trackID,之前使用AVAssetTrack出过很奇怪的问题,而后在StackOverFlow上找到了这个解决方案


 NSMutableArray<AVAudioMixInputParameters *> *trackMixArray = [NSMutableArray<AVAudioMixInputParameters *> array];
  {
    AVMutableAudioMixInputParameters *trackMix1 = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:_comTrack1];
    trackMix1.trackID = _comTrack1.trackID;
    [trackMix1 setVolume:_videoVolume atTime:kCMTimeZero];
    [trackMixArray addObject:trackMix1];
    
    AVMutableAudioMixInputParameters *trackMix2 = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:_comTrack2];
    trackMix2.trackID = _comTrack2.trackID;
    [trackMix2 setVolume:_musicVolume atTime:kCMTimeZero];
    [trackMixArray addObject:trackMix2];
  }
  
 audioMix.inputParameters = trackMixArray;

6 构建AVPlayerItem, 设置asset以及最重要的audioMix,然后交给AVPlayer就可以同时播放视频与音乐了!