Composition-多视频合并

是否接触过视频编辑软件,如 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 对象进行合成视频

你可能感兴趣的:(Composition-多视频合并)