无法使 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 创建一个实例变量,这样它就可以在方法本身之外存在。