因为项目需要导出视频的背景音乐要淡入淡出,这样显得不会那么唐突,特别是淡出,视频播放完成就直接没了。所以就写了以下方法:
#pragma mark - 视频音乐淡入淡出
-(void)videoMusicFadeInAndFadeOut:(NSString *)videoPath exportPath:(NSString *)exportPath
{
//视频来源路径
NSURL *videoInputFileUrl = [NSURL fileURLWithPath:videoPath];
//导出路径
NSURL *videoExportUrl = [NSURL fileURLWithPath:exportPath];
//删除相同导出路径的文件
unlink([exportPath UTF8String]);
//初始化开始时间
CMTime nextClipStartTime = kCMTimeZero;
//创建可变的音频视频组合
AVMutableComposition *mixComposition = [AVMutableComposition composition];
//视频采集
AVURLAsset *videoAsset = [[AVURLAsset alloc]initWithURL:videoInputFileUrl options:nil];
CMTimeRange videoTimeRange = CMTimeRangeMake(kCMTimeZero,videoAsset.duration);
AVAssetTrack *videoTrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVMutableCompositionTrack *videoCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
[videoCompositionTrack insertTimeRange:videoTimeRange ofTrack:videoTrack atTime:nextClipStartTime error:nil];
//声音采集 获取原视频中的音频 声音长度截取范围==视频长度
CMTimeRange audioTimeRange = CMTimeRangeMake(kCMTimeZero,videoAsset.duration);
//创建一个输出
AVAssetExportSession *assetExport = [[AVAssetExportSession alloc]initWithAsset:mixComposition presetName:AVAssetExportPresetMediumQuality];
assetExport.outputFileType = AVFileTypeMPEG4;
assetExport.shouldOptimizeForNetworkUse = YES;
assetExport.outputURL = videoExportUrl;
//判断该视频是否包含音频 如果没有 则不添加音频
if ([videoAsset tracksWithMediaType:AVMediaTypeAudio].count > 0) {
//获取视频中的音频轨道
AVAssetTrack *audioTrack = [[videoAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
//初始化一个音频容器
AVMutableCompositionTrack *audioCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
//插入音频到容器
[audioCompositionTrack insertTimeRange:audioTimeRange ofTrack:audioTrack atTime:nextClipStartTime error:nil];
//初始化音频混合器
AVMutableAudioMix *exportAudioMix = [AVMutableAudioMix audioMix];
//获取混合后的音轨
AVAssetTrack *mixCompositionTrack = [[mixComposition tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
//初始化音频混合器导出配置参数
AVMutableAudioMixInputParameters *exportAudioMixInputParameters = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:mixCompositionTrack];
//初始化淡入淡出持续时间 这个可以根据项目需求来设置这里前5秒淡入音量从0到1.0,最后5秒淡出音量从1.0到0 大家可以根据自己需求修改
CMTime continueTime = CMTimeMakeWithSeconds(5, 1);
//设置前5秒音乐淡入
[exportAudioMixInputParameters setVolumeRampFromStartVolume:0 toEndVolume:1.0 timeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(0, 1), continueTime)];
//计算开始淡出的时间
CMTime fadeOutStartTime = CMTimeSubtract(videoAsset.duration, continueTime);
//设置最后5秒音乐淡出
[exportAudioMixInputParameters setVolumeRampFromStartVolume:1.0 toEndVolume:0 timeRange:CMTimeRangeMake(fadeOutStartTime, continueTime)];
//设置音频混合器参数
NSArray *audioMixParameters = @[exportAudioMixInputParameters];
exportAudioMix.inputParameters = audioMixParameters;
//添加到导出配置中
assetExport.audioMix = exportAudioMix;
}
//开始导出
[assetExport exportAsynchronouslyWithCompletionHandler:
^(void ) {
NSLog(@"$$$");
NSLog(@"完成!输出路径==%@",exportPath);
}];
}
(有喜欢的关注下,也可以评论,后续会更多视频相关的代码,菜鸟一个不喜勿喷!!!)