原理理解:
一個視頻文件包含了 魄眉、 兩種類型的資源,我們在給視頻添加音頻時闷袒,其實就是把原視頻的音頻和視頻提取出來坑律,混合新的音頻后合成導(dǎo)出。步驟如下:
- 獲取視頻文件的videoTrack;
- 獲取視頻文件的audioTrack晃择;
- 獲取要添加的音頻文件的audioTrack冀值;
- 添加、合成宫屠、導(dǎo)出列疗。
在音視頻合成中,主要是用到了來進(jìn)行資源的整合浪蹂。
代碼如下:
- 創(chuàng)建composition
// 創(chuàng)建可變的音視頻組合
AVMutableComposition *comosition = [AVMutableComposition composition];
- 提取視頻文件的軌道
// 視頻資源抵栈,self.videoUrl 為視頻的資源路徑
AVURLAsset *videoAsset = [[AVURLAsset alloc] initWithURL:self.videoUrl options:nil];
// 視頻時間范圍
CMTimeRange videoTimeRange = CMTimeRangeMake(kCMTimeZero, videoAsset.duration);
// 給composition添加視頻軌道
AVMutableCompositionTrack *videoTrack = [comosition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
// 獲取視頻資源中的視頻軌道
AVAssetTrack *videoAssetTrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] firstObject];
// 把從視頻資源中獲取到的視頻軌道加入到可變軌道videoTrack中
//timeRange表示時間段,track是視頻資源中的軌道坤次,atTime表示開始時間
[videoTrack insertTimeRange:videoTimeRange ofTrack:videoAssetTrack atTime:kCMTimeZero error:nil];
//視頻原音的音頻處理
//給composition添加音頻軌道
AVMutableCompositionTrack *originalAudioTrack = [comosition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
// 獲取視頻資源中的音頻軌道
AVAssetTrack *originalAudioAssetTrack = [[videoAsset tracksWithMediaType:AVMediaTypeAudio] firstObject];
// 將獲取到的音頻軌道加入到可變音頻軌道originalAudioTrack中
[originalAudioTrack insertTimeRange:videoTimeRange ofTrack:originalAudioAssetTrack atTime:kCMTimeZero error:nil];
- 提取音頻文件的軌道
// 獲取音頻資源古劲,self.fileUrl為要添加到視頻中的音頻資源路徑
AVURLAsset *audioAsset = [[AVURLAsset alloc] initWithURL:self.fileUrl options:nil];
//時間段,這里需要考慮音頻時長大于視頻時長的情況
CMTimeRange audioTimeRange = CMTimeRangeMake(kCMTimeZero, audioAsset.duration);
// 給composition添加可變音頻軌道
AVMutableCompositionTrack *audioTrack = [comosition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
// 獲取音頻資源中的音頻軌道
AVAssetTrack *audioAssetTrack = [[audioAsset tracksWithMediaType:AVMediaTypeAudio] firstObject];
// 加入
[audioTrack insertTimeRange:audioTimeRange ofTrack:audioAssetTrack atTime:CMTimeMakeWithSeconds(model.startTime, self.player.currentTime.timescale) error:nil];
- 音量調(diào)節(jié)
//調(diào)節(jié)音量
AVMutableAudioMix *videoAudioMixTools = [AVMutableAudioMix audioMix];
NSMutableArray * params = [[NSMutableArray alloc] initWithCapacity:0];
//音樂軌道
AVMutableAudioMixInputParameters *musicAudioParam = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTrack];
//設(shè)置音軌音量,可以設(shè)置漸變,設(shè)置為1.0就是全音量
[musicAudioParam setVolumeRampFromStartVolume:self.volume toEndVolume:self.volume timeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration)];
[musicAudioParam setTrackID:audioTrack.trackID];
[params addObject:musicAudioParam];
//視頻原音軌道
AVMutableAudioMixInputParameters *originalAudioParam = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:originalAudioTrack];
//設(shè)置音軌音量,可以設(shè)置漸變,設(shè)置為1.0就是全音量
[originalAudioParam setVolumeRampFromStartVolume:1-self.volume toEndVolume:1-self.volume timeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration)];
[originalAudioParam setTrackID:originalAudioTrack.trackID];
[params addObject:originalAudioParam];
videoAudioMixTools.inputParameters = [NSArray arrayWithArray:params];
- 輸出
// 創(chuàng)建一個輸出
AVAssetExportSession *assetExport = [[AVAssetExportSession alloc] initWithAsset:comosition presetName:AVAssetExportPresetMediumQuality];
// 輸出類型
assetExport.outputFileType = AVFileTypeQuickTimeMovie;
// 輸出地址 outputFileUrl為沙盒地址
assetExport.outputURL = outputFileUrl;
// 優(yōu)化
assetExport.shouldOptimizeForNetworkUse = YES;
//音量
assetExport.audioMix = videoAudioMixTools;
// 合成完畢
[assetExport exportAsynchronouslyWithCompletionHandler:^{
// 回到主線程
dispatch_async(dispatch_get_main_queue(), ^{
//do something
});
}];
這是給視頻添加音頻缰猴,如果是給視頻拼接一段視頻产艾,也是同理可得了。