微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过AVAssetExportSession导出时,为什么CGImage会更改颜色?

如何解决通过AVAssetExportSession导出时,为什么CGImage会更改颜色?

我正在通过AVMutableComposition将CGImage覆盖在视频上,并且效果很好(请参见下面的屏幕快照A)。问题是当我使用AVAssetExportSession导出视频时,我得到了一些奇怪的轮廓和颜色(请参见屏幕快照B)。如何导出保留CGImage正确颜色且没有奇怪的黄色/黑色轮廓的视频?

这是我要导出的代码

func saveVideo(composition: AVMutableComposition,vidComp: AVMutableVideoComposition,audioMix: AVMutableAudioMix) {
    let preset = "AVAssetExportPreset1920x1080"
    guard let exportSession = AVAssetExportSession(asset: composition,presetName: preset) else {
        return
    }

    let videoSize: CGSize = vidComp.renderSize

    let parentLayer = CALayer()
    parentLayer.isGeometryFlipped = true
    parentLayer.frame = CGRect(x: 0,y: 0,width: videoSize.width,height: videoSize.height)

    let videoLayer = CALayer()
    videoLayer.frame = CGRect(x: 0,height: videoSize.height)
    parentLayer.addSublayer(videoLayer)


    let url = URL(fileURLWithPath: Bundle.main.path(forResource: "Fire1",ofType: "mov")!)
    let asset = AVURLAsset(url: url)
    let generator = AVAssetimageGenerator(asset: asset)
    generator.appliesPreferredTrackTransform = true
    generator.requestedTimetoleranceBefore = .zero
    generator.requestedTimetoleranceAfter = .zero

    do {
        let cgImg = try generator.copyCGImage(at: CMTime(seconds: 0.5,preferredTimescale: 1000),actualTime: nil)
        let imgLayer = CALayer()
        imgLayer.contentsGravity = .resizeAspect
        imgLayer.contents = cgImg
        imgLayer.frame = parentLayer.bounds
        parentLayer.addSublayer(imgLayer)
    } catch {
        print("No thumbnail")
    }

    vidComp.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videoLayer,in: parentLayer)

    exportSession.videoComposition = vidComp
    exportSession.audioMix = audioMix
    exportSession.outputURL = self.uniqueURLForSave()
    exportSession.outputFileType = AVFileType.mov
    exportSession.shouldOptimizeforNetworkUse = true
    exportSession.exportAsynchronously {
        switch exportSession.status {
        case .completed:
            UISaveVideoAtPathToSavedPhotosAlbum(exportSession.outputURL!.relativePath,self,nil,nil)
        default:
            print("Error")
        }
    }
}

屏幕截图A(正确的图像):

enter image description here

截屏B(带有黄色和黑色轮廓的故障图像):

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。