如何将用于不同AVComposition的AVVideoComposition合并为一个

问题描述

我有多个AVAsset视频,我使用AVComposition中的timeRanges将它们串在一起。每个视频都有一个关联的AVVideoComposition,该animationTool使用AVVideoCompositions向视频添加叠加层。我希望能够以类似于AVComposition的方式将这些AVVideoComposition串在一起,以便与每个AVAset关联的图层在指定的开始/结束时间显示/隐藏。我该怎么办?

我目前使用此代码为具有单个AVAset的AVComposition创建// Create video composition let videoComposition = AVMutableVideoComposition() videoComposition.renderSize = videoSize videoComposition.frameDuration = CMTime(value: 1,timescale: 30) videoComposition.animationTool = AVVideoCompositionCoreAnimationTool( postProcessingAsVideoLayer: videoLayer,in: outputLayer ) let instruction = AVMutableVideoCompositionInstruction() instruction.timeRange = CMTimeRange( start: .zero,duration: composition.duration ) let layerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: compositionTrack) layerInstruction.setTransform(assetTrack.preferredTransform,at: .zero) instruction.layerInstructions = [layerInstruction] videoComposition.instructions = [instruction]

AVComposition

这是我用于创建具有多个资产的static func createFullVideo(from videos: [VideoItem]) -> AVComposition? { let newComposition = AVMutableComposition() guard let compositionTrack = newComposition.addMutableTrack( withMediaType: .video,preferredTrackID: kCMPersistentTrackID_Invalid) else { return nil } guard let compositionAudioTrack = newComposition.addMutableTrack( withMediaType: .audio,preferredTrackID: kCMPersistentTrackID_Invalid) else { return nil } var endTimeOfPrevIoUsTrack: CMTime = .zero for video in videos { let composition = video.composition guard let assetTrack = composition.tracks(withMediaType: .video).first else { return nil } compositionTrack.preferredTransform = assetTrack.preferredTransform do { // Insert time range for video track in composition let timeRange = assetTrack.timeRange try compositionTrack.insertTimeRange(timeRange,of: assetTrack,at: endTimeOfPrevIoUsTrack) // Get the audio track from the asset guard let audioAssetTrack = composition.tracks(withMediaType: .audio).first else { return nil } // Insert time range for audio track in composition try compositionAudioTrack.insertTimeRange( timeRange,of: audioAssetTrack,at: endTimeOfPrevIoUsTrack ) // Store end time of track endTimeOfPrevIoUsTrack = CMTimeAdd(endTimeOfPrevIoUsTrack,assetTrack.timeRange.duration) } catch { return nil } return newComposition } 代码

watchOS

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)