I'm working on a video app, that requires displaying text over video for a certain range of time, I need to display different text for different time ranges.
I've already created a text layer and combined it in video composition. But my problem is I don't know how to change text based on time ranges.
Here is what I've done so far.
// init variables
let videoAsset: AVAsset = AVAsset(url: videoUrl) as AVAsset
let tracks = videoAsset.tracks(withMediaType: AVMediaType.video)
let videoAssetTrack = tracks.first!
let size = videoAssetTrack.naturalSize
// build video composition
let videoComposition = AVMutableVideoComposition()
videoComposition.renderSize = CGSize(width: size.width, height: size.height)
videoComposition.frameDuration = CMTimeMake(value: 1, timescale: 30)
// create text Layer
let titleLayer = CATextLayer()
titleLayer.backgroundColor = UIColor.yellow.cgColor
titleLayer.foregroundColor = UIColor.black.cgColor
titleLayer.string = "Dummy text"
titleLayer.shadowOpacity = 0.5
titleLayer.alignmentMode = CATextLayerAlignmentMode.center
titleLayer.frame = CGRect(x: 0, y: 50, width: size.width, height: size.height / 6)
let videolayer = CALayer()
videolayer.frame = CGRect(x: 0, y: 0, width: size.width, height: size.height)
let parentlayer = CALayer()
parentlayer.frame = CGRect(x: 0, y: 0, width: size.width, height: size.height)
parentlayer.addSublayer(videolayer)
parentlayer.addSublayer(titleLayer)
let animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videolayer, in: parentlayer)
videoComposition.animationTool = animationTool
// create instructions
let instructionTimeRange = CMTimeRangeMake(start: CMTime.zero, duration: videoAssetTrack.timeRange.duration)
let instruction = AVMutableVideoCompositionInstruction()
instruction.timeRange = instructionTimeRange
let layerinstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoAssetTrack)
instruction.layerInstructions = NSArray(object: layerinstruction) as! [AVVideoCompositionLayerInstruction]
videoComposition.instructions = [instruction]
// create exporter and export
let exporter = AVAssetExportSession(asset: videoAsset, presetName: AVAssetExportPresetHighestQuality)
exporter!.videoComposition = videoComposition
exporter!.outputURL = exportUrl
exporter!.outputFileType = AVFileType.mov
exporter!.shouldOptimizeForNetworkUse = true
exporter!.exportAsynchronously() {
DispatchQueue.main.async {
self.exportDidFinish(exporter!)
}
}
I want to display "some other text" for x( let it be 30.0) sec to y(suppose 50.0) sec of the video.
Edit: I've read this Add a text overlay with AVMutableVideoComposition to a specific timerange
but using CAKeyframeAnimation I'm able to show or hide text for specific time range, can I change the text using Animation, or do I need to use multiple text layers to achieve this.
I'll appreciate any hint or solution. TIA.