Как показать другой текст поверх видео в зависимости от временного диапазона с помощью CATextLayer?

Я работаю над видеоприложением, которое требует отображения текста поверх видео в течение определенного периода времени, мне нужно отображать другой текст для разных диапазонов времени.

Я уже создал текстовый слой и объединил его в видеокомпозицию. Но моя проблема в том, что я не знаю, как изменить текст в зависимости от временных диапазонов.

Вот что я сделал до сих пор.

        // 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!)
            }
        }

Я хочу отобразить «какой-то другой текст» для x (пусть это будет 30,0) секунд до y (допустим, 50,0) секунд видео.

Изменить: я прочитал это Добавить наложение текста с помощью AVMutableVideoComposition для определенного временного диапазона

но с помощью CAKeyframeAnimation я могу отображать или скрывать текст для определенного диапазона времени, могу ли я изменить текст с помощью анимации или мне нужно использовать несколько текстовых слоев для достижения этой цели.

Я буду признателен за любой намек или решение. ТИА.


person Nazmul Islam    schedule 19.06.2019    source источник