无法使 GPUImageAlphaBlendFilter 将静态图像覆盖在电影文件上
Can't make GPUImageAlphaBlendFilter overlay static image over movie file
我无法让它工作。结果我总是有一部空电影。如果我用 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 将在退出此方法时释放此图片,并将其输入拆除到处理链中。执行此方法后继续录制的电影将出现乱码。
一个简单的解决方案是在拥有此方法的 class 中为 markerInput
创建一个实例变量,这样它就可以在方法本身之外存在。
我无法让它工作。结果我总是有一部空电影。如果我用 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 将在退出此方法时释放此图片,并将其输入拆除到处理链中。执行此方法后继续录制的电影将出现乱码。
一个简单的解决方案是在拥有此方法的 class 中为 markerInput
创建一个实例变量,这样它就可以在方法本身之外存在。