ios - 无法使 GPUImageAlphaBlendFilter 在电影文件上覆盖静态图像

标签 ios gpuimage

我无法让它工作。结果我总是有一部空电影。如果我用 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/

相关文章:

ios - AudioKit (iOS) - 为频率/振幅变化添加观察者

ios - 使用 UISlider 应用 GPUImage 过滤器

ios - GPUImage 相机打不开

ios - 实时混合 UIImages

swift - 将 GPUImage MultipleBlend 从 OBJ-C 转换为 Swift

ios - 使用 GPUImage 和 GPUImageHoughTransformLineDetector 检测突出显示的文本边界框

ios - 如何检测 UIViewController 完成加载?

ios - 底部共享菜单 iOS [Obj-c]

ios - 使用 UISlider 作为 UISwitch(两个状态对象)

ios - Swift 如何正确更新 UITableViewCell 约束