微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何将用于不同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 举报,一经查实,本站将立刻删除。