删除视频背景音乐
删除视频的背景音乐其实很简单,把视频数据导入进来,然后我们的视频数据其实是有两条轨道一条是音频,另外一条是视频。由于数据的tracks(轨道包含多条音视频)
是只读的,所以在这里重新创建一个混合器,然后把数据源的视频轨道拿过来。重新生成一个媒体文件,丢弃了音频,这样就将视频的音频给删除掉了。
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/** 给视频添加背景音乐 */
static func video_add_backgroundAudio(_ url: URL, audioURL: URL, finish:@escaping (URL?)->Void) {
/** 导出视频路径 */
let exportURL = URL(fileURLWithPath: get_audio_name("."+url.pathExtension))
/** 删除文件 */
try? FileManager.default.removeItem(at: exportURL)
/** 获取数据源 */
let videoAsset = AVURLAsset(url: url)
let audioAsset = AVURLAsset(url: audioURL)
/** 时长 */
let timeRange = CMTimeRangeMake(start: CMTime.zero, duration: videoAsset.duration)
/** 音频视频轨道 */
guard let videoTrack = videoAsset.tracks(withMediaType: .video).last else {
finish(nil)
return
}
guard let audioTrack = audioAsset.tracks(withMediaType: .audio).last else {
finish(nil)
return
}
/** 混合器 */
let mixComposition = AVMutableComposition()
/** 添加视频轨道 */
let videoCompositionTrack = mixComposition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)
try? videoCompositionTrack?.insertTimeRange(timeRange, of: videoTrack, at: CMTime.zero)
/** 添加音频轨道 */
let audioCompositionTrack = mixComposition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid)
try? audioCompositionTrack?.insertTimeRange(timeRange, of: audioTrack, at: CMTime.zero)
/** 合成输出 */
let assetExport = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality)
assetExport?.outputURL = exportURL
/** 设置视频导出格式 */
var fileType: AVFileType = .mov
if url.pathExtension == "mp4" {
fileType = .mp4
}
assetExport?.outputFileType = fileType
assetExport?.shouldOptimizeForNetworkUse = true
assetExport?.exportAsynchronously(completionHandler: {
if assetExport?.status == AVAssetExportSession.Status.completed {
finish(exportURL)
} else {
finish(nil)
print("error = \(assetExport?.error?.localizedDescription ?? "删除视频的音频失败")")
}
})
}