iOS实现视频背景音乐淡入淡出

因为项目需要导出视频的背景音乐要淡入淡出,这样显得不会那么唐突,特别是淡出,视频播放完成就直接没了。所以就写了以下方法:

#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);
     }];
}

(有喜欢的关注下,也可以评论,后续会更多视频相关的代码,菜鸟一个不喜勿喷!!!)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值