问题描述
我有多个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 (将#修改为@)