gpt4 book ai didi

swift - 如何在 Swift 3 中每秒更改一次的视频中添加文本水印?

转载 作者:搜寻专家 更新时间:2023-11-01 05:34:16 26 4
gpt4 key购买 nike

我创建了一个显示当前时间的水印,但它不会每秒都在变化。我该怎么做才能使文本每秒更改一次?我想花时间制作安全录像之类的视频。下面的代码可以很好地在视频顶部添加文本。

  func waterMark(){
let filePath: String = Bundle.main.path(forResource: "Zombie", ofType: "mp4")!
let videoAsset = AVURLAsset(url: URL(fileURLWithPath: filePath), options: nil)
let mixComposition = AVMutableComposition()
let compositionVideoTrack: AVMutableCompositionTrack? = mixComposition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid)

let clipVideoTrack = videoAsset.tracks(withMediaType: AVMediaTypeVideo)[0]
try? compositionVideoTrack?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: clipVideoTrack, at: kCMTimeZero)
compositionVideoTrack?.preferredTransform = videoAsset.tracks(withMediaType: AVMediaTypeVideo)[0].preferredTransform
let videoSize: CGSize = clipVideoTrack.naturalSize
let aLayer = CALayer()
aLayer.contents = (Any).self

aLayer.frame = CGRect(x: videoSize.width - 65, y: videoSize.height - 75, width: 57, height: 57)
aLayer.opacity = 0.65
let parentLayer = CALayer()
let videoLayer = CALayer()
parentLayer.frame = CGRect(x: 0, y: 0, width: videoSize.width, height: videoSize.height)
videoLayer.frame = CGRect(x: 0, y: 0, width: videoSize.width, height: videoSize.height)
parentLayer.addSublayer(videoLayer)
parentLayer.addSublayer(aLayer)
let titleLayer = CATextLayer()



let dateFormatter = DateFormatter()
dateFormatter.timeStyle = .medium

// titleLayer.backgroundColor = UIColor.black.cgColor
titleLayer.string = String( (dateFormatter.string(from: Date() as Date)))

titleLayer.font = UIFont.systemFont(ofSize: 100)
titleLayer.shadowOpacity = 0.5
titleLayer.frame = parentLayer.frame
titleLayer.display()
//You may need to adjust this for proper display
parentLayer.addSublayer(titleLayer as? CALayer ?? CALayer())
let videoComp = AVMutableVideoComposition()
videoComp.renderSize = videoSize
videoComp.frameDuration = CMTimeMake(1, 30)
videoComp.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videoLayer, in: parentLayer)
let instruction = AVMutableVideoCompositionInstruction()
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, mixComposition.duration)
let videoTrack = mixComposition.tracks(withMediaType: AVMediaTypeVideo)[0]
let layerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack)
instruction.layerInstructions = [layerInstruction]
videoComp.instructions = [instruction]
let assetExport = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality)
//AVAssetExportPresetPassthrough
assetExport?.videoComposition = videoComp
var paths: [Any] = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)

let documentsDirectory: String = paths[0] as? String ?? ""
let VideoName: String = "\(documentsDirectory)/mynewwatermarkedvideo.mp4"

let exportUrl = URL(fileURLWithPath: VideoName)
if FileManager.default.fileExists(atPath: VideoName) {
print(VideoName)
try? FileManager.default.removeItem(atPath: VideoName)
print("file found again")
}
assetExport?.outputFileType = AVFileTypeQuickTimeMovie
assetExport?.outputURL = exportUrl
assetExport?.shouldOptimizeForNetworkUse = true
//[strRecordedFilename setString: exportPath];
assetExport?.exportAsynchronously(completionHandler: {() -> Void in
DispatchQueue.main.async(execute: {() -> Void in
})
})
print("Completed")

}



///call
waterMark()

最佳答案

您需要添加一个计时器来更新 titleLayer。

var timer: NSTimer?

override func viewDidLoad() {
super.viewDidLoad()

timer = Timer.scheduledTimer(timeInterval: 60, target: self, selector: #selector(self.getTimeOfDate), userInfo: nil, repeats: true)
}

func getTimeOfDate() {
var curDate = Date()

timeLabel.text = formatter.string(from: curDate)

}

关于swift - 如何在 Swift 3 中每秒更改一次的视频中添加文本水印?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45199044/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com