ios - 为录制的视频添加水印并保存

标签 ios swift avasset

所以我尝试使用以下代码为以前录制的视频添加水印,但是当我查看视频时,没有水印。谁能帮忙?我尝试关注以下帖子:iPhone Watermark on recorded Video.

    public func addWatermarkToVideo(url: NSURL, completion:(url: NSURL?) -> Void) {
    let videoAsset = AVURLAsset(URL: url)
    let mixComposition = AVMutableComposition()
    let compositionVideoTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid)
    let clipVideoTrack: AVAssetTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0]
    do {
        try compositionVideoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), ofTrack: clipVideoTrack, atTime: kCMTimeZero)
    } catch {
        print(error)
    }

    compositionVideoTrack.preferredTransform = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0].preferredTransform

    //Add watermark
    guard let myImage = UIImage(named: "Logo") else {
        completion(url: nil)
        return
    }
    let aLayer = CALayer()
    aLayer.contents = myImage.CGImage
    aLayer.frame = CGRectMake(5, 25, 100, 57)
    aLayer.opacity = 0.65

    let videoSize = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0].naturalSize
    let parentLayer = CALayer()
    let videoLayer = CALayer()
    parentLayer.frame = CGRectMake(0, 0, videoSize.width, videoSize.height)
    videoLayer.frame = CGRectMake(0, 0, videoSize.width, videoSize.height)
    parentLayer.addSublayer(videoLayer)
    parentLayer.addSublayer(aLayer)

    let videoComp = AVMutableVideoComposition()
    videoComp.renderSize = videoSize
    videoComp.frameDuration = CMTimeMake(1,30)
    videoComp.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videoLayer, inLayer: parentLayer)

    let instruction = AVMutableVideoCompositionInstruction()
    instruction.timeRange = CMTimeRangeMake(kCMTimeZero, mixComposition.duration)
    let videoTrack = mixComposition.tracksWithMediaType(AVMediaTypeVideo)[0]
    let layerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack)
    instruction.layerInstructions = [layerInstruction]
    videoComp.instructions = [instruction]

    let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
    let documentsDirectory: AnyObject = paths[0]
    let dataPath = documentsDirectory.stringByAppendingPathComponent("VideoCache")

    if (!NSFileManager.defaultManager().fileExistsAtPath(dataPath)) {
        do {
            try NSFileManager.defaultManager().createDirectoryAtPath(dataPath, withIntermediateDirectories: false, attributes: nil)
        } catch {
            print("Couldn't create path")
        }
    }
    let tempURL = NSURL(fileURLWithPath: dataPath)
    let completeMovieUrl = tempURL.URLByAppendingPathComponent("tether-\(NSDate()).mov")

    if let exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality) {
        exporter.outputURL = completeMovieUrl
        exporter.outputFileType = AVFileTypeMPEG4
        exporter.exportAsynchronouslyWithCompletionHandler({ () -> Void in
            switch exporter.status {
            case  .Failed:
                print("failed \(exporter.error)")
                completion(url: nil)
                break
            case .Cancelled:
                print("cancelled \(exporter.error)")
                completion(url: nil)
                break
            default:
                print("complete")
                completion(url: exporter.outputURL)
            }
        })
    }
}

最佳答案

您忘记将您的videoComposition 添加到AVAssetExportSession:

exporter.outputFileType = AVFileTypeMPEG4 // You had this
exporter.videoComposition = videoComp     // but had forgotten this
exporter.exportAsynchronouslyWithCompletionHandler({ // ...

关于ios - 为录制的视频添加水印并保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34363484/

相关文章:

ios - 处理 AVAsset 中的所有帧

ios - 从使用 AVAssetImageGenerator 获得的视频或拇指获取方向

android - 我可以对其他应用程序使用 Appium 运行测试吗?

ios - CIGaussianBlur 图像大小

ios - 无法从字典值转换为数组

ios - crash_info_entry_0 : CoreUI: deallocating _CUIInternalLinkRendition . .. Assets.car

ios - 有没有办法自动删除通过 iOS 应用程序拍摄的照片?

ios - plist的最大存储容量是多少?

swift - 错误: use of undeclared type '$__lldb_context' in NSAttributedString extension

ios - 在输出到文件之前从 AVAssetWriter 中删除缓冲区