美文网首页
Composition-多视频合并

Composition-多视频合并

作者: 烧烤有点辣 | 来源:发表于2021-01-18 17:20 被阅读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 对象进行合成视频

    相关文章

      网友评论

          本文标题:Composition-多视频合并

          本文链接:https://www.haomeiwen.com/subject/svpxzktx.html