音频剪切

1.音频剪切比较简单传入音频文件和剪切的时间段就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/** 初始化输出文件路径 */
NSString *url = "音频源文件路径";
NSString *outPutPath = "音频前切完成输出文件路径";
NSURL *audioFileOutput = [NSURL fileURLWithPath:outPutPath];
[[NSFileManager defaultManager] removeItemAtURL:audioFileOutput error:NULL];

/** 初始化要剪切的音频文件 */
AVAsset *asset = [AVAsset assetWithURL:url];

AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:asset
presetName:AVAssetExportPresetAppleM4A];
/** 剪切的时间段 */
CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(startTime, endTime);

exportSession.outputURL = audioFileOutput;
exportSession.outputFileType = AVFileTypeAppleM4A;
exportSession.timeRange = exportTimeRange;

[exportSession exportAsynchronouslyWithCompletionHandler:^{
if (AVAssetExportSessionStatusCompleted == exportSession.status) {
NSLog(@" FlyElephant \n %@", outPutPath);
} else if (AVAssetExportSessionStatusFailed == exportSession.status) {
NSLog(@"FlyElephant error: %@", exportSession.error.localizedDescription);
}
}];

音频的合成

1.音频的合成这里的背景是有一段录音需要加一个背景音乐,视频合成的也是一样的道理把音频源文件改成视频,然后相应的配置改成文件就好了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
NSString *exportPath = @"导出文件路径";
NSString *url = @"音频源文件路径";
//音频来源路径
NSURL *audioUrl = [NSURL fileURLWithPath:url];
NSURL *backPathUrl = [NSURL fileURLWithPath:backPath];
//导出路径
NSURL *exporAudiotPath = [NSURL fileURLWithPath:exportPath];
//删除相同导出路径的文件
unlink([exportPath UTF8String]);
//创建可变的音频视频组合
AVMutableComposition *mixComposition = [AVMutableComposition composition];
/** 初始化音频 */
AVURLAsset *audioAsset = [[AVURLAsset alloc] initWithURL:audioUrl options:nil];
AVURLAsset *audioBack = [[AVURLAsset alloc] initWithURL:backPathUrl options:nil];

/** 音乐的时间 */
CMTimeRange audio_timeRange = CMTimeRangeMake(kCMTimeZero,audioAsset.duration);

//获取视频或者音频中的音频轨道
AVAssetTrack *audioTrack = [[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
AVAssetTrack *audioBackTrack = [[audioBack tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
//可变音视频轨道添加一个 音频通道
AVMutableCompositionTrack *audioCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
AVMutableCompositionTrack *audioCompositionBackTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
//插入音频到容器
[audioCompositionTrack insertTimeRange:audio_timeRange ofTrack:audioTrack atTime:kCMTimeZero error:nil];
[audioCompositionBackTrack insertTimeRange:audio_timeRange ofTrack:audioBackTrack atTime:kCMTimeZero error:nil];


//初始化音频混合器
AVMutableAudioMix *exportAudioMix = [AVMutableAudioMix audioMix];
//获取到第二条音轨并且设置他的音量大小
AVAssetTrack *mixCompositionTrack = [[mixComposition tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:1];
//初始化音频混合器导出配置参数
AVMutableAudioMixInputParameters *exportAudioMixInputParameters = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:mixCompositionTrack];
/** 设置第二条音轨的背景音效声音大小 */
[exportAudioMixInputParameters setVolumeRampFromStartVolume:0 toEndVolume:[AVAudioSession sharedInstance].outputVolume * 0.6 timeRange:audio_timeRange];
NSArray *audioMixParameters = @[exportAudioMixInputParameters];
exportAudioMix.inputParameters = audioMixParameters;


//创建一个输出
AVAssetExportSession* assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetAppleM4A];
/** 导出文件的地址 */
assetExport.outputURL = exporAudiotPath;
/** 导出文件的格式 */
assetExport.outputFileType = @"com.apple.m4a-audio";
/** 网络优化 */
assetExport.shouldOptimizeForNetworkUse = YES;
assetExport.audioMix = exportAudioMix;
[assetExport exportAsynchronouslyWithCompletionHandler:
^(void ) {
NSLog(@"$$$");
NSLog(@"完成!输出路径==%@",exportPath);
if(completion)completion(exportPath);
}];

音频的淡入淡出

1.音频的淡入只需要设置音频音轨开始的音量从0到正常的音量,淡出只需要设置音轨音量从淡出时间到结束从正常音量到0就行了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
NSString *exportPath = @"音频导出文件路径";
NSString *exportPath = @"音频源文件路径";
//淡入时间
NSInteger fadeInTime = 5;
//淡出时间
NSInteger fadeOutTime = 5;
//音频来源路径
NSURL *audioUrl = [NSURL fileURLWithPath:url];
//导出路径
NSURL *exporAudiotPath = [NSURL fileURLWithPath:exportPath];
//删除相同导出路径的文件
unlink([exportPath UTF8String]);
//初始化开始时间
CMTime nextClipStartTime = kCMTimeZero;
//创建可变的音频视频组合
AVMutableComposition *mixComposition = [AVMutableComposition composition];
//初始化音频文件
AVURLAsset *audioAsset = [[AVURLAsset alloc] initWithURL:audioUrl options:nil];
/** 获取音频时长 */
CMTimeRange audioTimeRange = CMTimeRangeMake(kCMTimeZero,audioAsset.duration);

//创建一个输出
AVAssetExportSession* assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetAppleM4A];
assetExport.outputURL = exporAudiotPath;
assetExport.outputFileType = @"com.apple.m4a-audio";
assetExport.shouldOptimizeForNetworkUse = YES;
//获取音频文件中的音频轨道
AVAssetTrack *audioTrack = [[audioAsset 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 大家可以根据自己需求修改
/** 获取当前的音频 */
CGFloat volume = [AVAudioSession sharedInstance].outputVolume;
if(fadeInTime > 0){
// 设置前5秒音乐淡入
CMTime continueFadeInTime = CMTimeMakeWithSeconds(fadeInTime, 1);
[exportAudioMixInputParameters setVolumeRampFromStartVolume:0 toEndVolume:volume timeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(0, 1), continueFadeInTime)];
}
if(fadeOutTime > 0){
// 计算开始淡出的时间
CMTime continueFadeOutTime = CMTimeMakeWithSeconds(fadeOutTime, 1);
CMTime fadeOutStartTime = CMTimeSubtract(audioAsset.duration, continueFadeOutTime);
// 设置最后5秒音乐淡出
[exportAudioMixInputParameters setVolumeRampFromStartVolume:volume toEndVolume:0 timeRange:CMTimeRangeMake(fadeOutStartTime, continueFadeOutTime)];
}
// 设置音频混合器参数
NSArray *audioMixParameters = @[exportAudioMixInputParameters];
exportAudioMix.inputParameters = audioMixParameters;
//添加到导出配置中
assetExport.audioMix = exportAudioMix;
//开始导出
[assetExport exportAsynchronouslyWithCompletionHandler:
^(void ) {
NSLog(@"$$$");
NSLog(@"完成!输出路径==%@",exportPath);
if(completion)completion(exportPath);
}];
相关文章
评论
分享
  • 删除视频背景音乐、添加视频背景音乐

    删除视频背景音乐删除视频的背景音乐其实很简单,把视频数据导入进来,然后我们的视频数据其实是有两条轨道一条是音频,另外一条是视频。由于数据的tracks(轨道包含多条音视频)是只读的,所以在这里重新创建一个混合器,然后把数据源的视频轨道...

    删除视频背景音乐、添加视频背景音乐
  • AAC音频转WAV

    将aac编码格式的音频转为lpcm编码的音频,转出来的音频会比原来大个10倍左右.1234567891011121314151617181920212223242526272829303132333435363738394041424...

    AAC音频转WAV
  • Message Filtter Extension 短信过滤

    手机最近老是收到各种垃圾短信,于是想要自己写一个app来过滤垃圾短信,找到了Message Filtter Extension 1.首先创建一个空的工程,然后创建好了之后添加一个target。1选中工程->Editor-&g...

    Message Filtter Extension 短信过滤
  • Shell删除所有苹果证书

    123456789101112131415161718#!/bin/bashexpired=$(security find-identity)if [ -z "$expired" ] #-z判断字符串长度是否为0 为0返回tru...

    Shell删除所有苹果证书
  • Swift语言国际化

    第一步在工程设置里面添加对应国际化的语言 第二步添加Localizble.strings 第三步选择Localizble.strings文件,然后选择Localize…选择需要的语言,选择完了之后你就会看见刚才创建的Localizbl...

    Swift语言国际化
  • Docker Nginx 静态资源部署

    1. 查看docker仓库中的nginx命令1docker search nginx 2.为选定需要pull到系统重的官方Nginx镜像1docker pull nginx 这个过程需要时间,需要耐心等待一下。看到这个图就是成功了。 ...

    Docker Nginx 静态资源部署
  • Nginx vue打包部署

    最近在弄vue的项目,完了需要打包部署到服务器,然后之前也没有弄过自己在这边一边查资料一边琢磨怎么弄。幸运的是花了一天半的时间还搞定了。 1.在conf.d文件下添加一个新的配置文件,12345678910111213141516...

    Nginx vue打包部署
  • SCP文件上传下载

    从服务器获取文件1scp -p 8080 root@192.168.1.1:/usr/temp/file.txt /Desktop/ 上传文件到服务器1scp -p 8080 /Desktop/uploadfile root@192....

    SCP文件上传下载
  • swift 做一个答题的功能

    实现的效果是:1.点击答案,判断正确,如果选择的答案错误显示出正确的答案。然后可以浏览上一题的信息。2.可以查看上一题的答题情况。看下效果图吧 思路:1.看看题的模型吧,我这里是用一个数组来装的一个类,然后点击下一题的时候数组索引+...

    swift 做一个答题的功能
  • iOS原生调用ReatNative

    有一个RN的项目其中一个即时通讯的模块需要用原生来写所以这里面就涉及到iOS原生和RN的交互。 iOS调用RN1.创建一个交互通信的类。1234#import <React/RCTEventEmitter.h>#imp...

    iOS原生调用ReatNative