Composition-多视频合并
2021-01-18 本文已影响0人
烧烤有点辣
是否接触过视频编辑软件,如 Premiere 软件。
在PR上制作一个视频,我们首先需要创建一个新的序列,然后在这序列上添加上视频和音频的轨道。同理在iOS上实现视频合并也是如此流程。
1610961280181.jpg
AVFoundation 为音视频编辑提供了功能丰富的类集。AVMutableComposition是其中一个比较核心的对象,它提供了视频的插入和删除操作,以及调换顺序等音视频的操作。
- AVMutableComposition -- 工程文件(pr中的序列)
- AVMutableCompositionTrack -- 视频/音频轨道
- AVAssetTrack -- 音频/视频片段
创建Composition
可以使用 AVMutableComposition类创建一个自定义的Composition。也可以使用AVMutableCompositionTrack类在自定义的Composition中添加一个或多个composition tracks.
这里通过 video track 和 audio track 创建的例子:
//工程文件
let mutableComposition = AVMutableComposition()
//工程文件中添加一个视频轨道
let mutableCompositionVideoTrack = mutableComposition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)
//工程文件中添加一个音频轨道
let mutableCompositionAudioTrack = mutableComposition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid)
AVMutableComposition继承于AVAsset,可以用于AVPlayer的播放和最终的合成。也可以把Composition理解为是一个AVAsset,AVAsset能用的地方,它都可以使用。
AVAssetTrack获取插入轨道
通过视频地址得到一个AVAsset资源对象,这个AVAsset对象就是一个视频资源,里面有我们所需要的视频、音频、时间、视频大小等数据。
通过AVAsset获取AVAssetTrack
for videoUrl in videoPaths {
let videoAsset = AVAsset(url: videoUrl)
//获取素材中的视频轨道
let videoAssetTrack = videoAsset.tracks(withMediaType: .video).first!
do {
//视频插入工程文件中的视频轨道中
try mutableCompositionVideoTrack?.insertTimeRange(CMTimeRangeMake(start: .zero, duration: videoAssetTrack.timeRange.duration), of: videoAssetTrack, at: .zero)
} catch _ {
print("Failed to load video track")
}
//音频同视频一样
let audioAssetTrack = videoAsset.tracks(withMediaType: .audio).first!
do {
/视频插入工程文件中的视频轨道中
try mutableCompositionAudioTrack?.insertTimeRange(CMTimeRangeMake(start: .zero, duration: videoAssetTrack.timeRange.duration), of: audioAssetTrack, at: .zero)
} catch _ {
print("Failed to load audio track")
}
}
得到最终的Composition
此时就可以拿这Composition对象,用于AVPlayer播放,或者 AVAssetExportSession 对象进行合成视频