1

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.

Nazmul Islam
  • 142
  • 9

0 Answers0