我无法让它工作。结果我总是有一部空电影。如果我用 GPUImagePixellateFilter 之类的东西替换 GPUImageAlphaBlendFilter,视频就可以正常渲染。
func convertVideo(source: URL, destination: URL, encodingPreferenses: VideoEncodingParams = .profileMedium,
overlayImage: UIImage?, completion: @escaping ExportAsyncBlock = { _, _ in }) {
let movieFile = GPUImageMovie(url: source)
movieFile?.runBenchmark = true
let alphaFilter = GPUImageAlphaBlendFilter()
alphaFilter.mix = 1.0
let markerInput = GPUImagePicture(image: ImageUtils.sharedUtils.resizeImage(overlayImage!, newSize: encodingPreferenses.videoSize, scaleFactor: 1.0))
movieFile?.addTarget(alphaFilter)
markerInput?.addTarget(alphaFilter)
let movieWriter = GPUImageMovieWriter(movieURL: destination, size: encodingPreferenses.videoSize)
alphaFilter.addTarget(movieWriter)
movieWriter?.shouldPassthroughAudio = true
movieFile?.audioEncodingTarget = movieWriter
movieFile?.enableSynchronizedEncoding(using: movieWriter)
movieWriter?.startRecording()
movieFile?.startProcessing()
movieWriter?.completionBlock = {
print("Ahoy")
movieFile?.removeAllTargets()
movieWriter?.finishRecording {
print("Ahoy")
}
}
}
最佳答案
电影播放/录制过程异步发生。因此,它不会在您上面的方法完成时完成。
您的 markerInput
GPUImagePicture 实例在该方法内分配,并且在该方法之外没有提供强引用。因此,ARC 将在退出此方法时释放此图片,并将其输入拆除到处理链中。完成此方法后继续进行的电影录制将出现乱码。
一个简单的解决方案是在拥有此方法的类中为 markerInput
创建一个实例变量,这样它就可以在方法本身之外存在。
关于ios - 无法使 GPUImageAlphaBlendFilter 在电影文件上覆盖静态图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40372837/