GPUImage2重复添加视频滤镜报错:超出目标输入容量
解决GPUImage2重复添加滤镜时的目标容量错误
问题分析
你碰到的Warning: tried to add target beyond target's input capacity错误,核心是重复的节点连接没被彻底清理,或者旧的MovieInput实例没被正确停止释放,导致后续添加新滤镜时,某个处理节点的输入端口被占满,没法再添加新目标。
看你的代码有几个关键问题:
- 每次调用
startVideoWithFilter都会重新创建MovieInput,但旧实例只调用了removeAllTargets(),没停止播放也没置为nil,它可能还在后台运行并占用资源。 selectedFilter.removeAllTargets()逻辑有问题:如果selectedFilter是上一次的滤镜,而当前传入的是新filter,这行和当前要设置的滤镜无关,反而可能没正确断开旧滤镜和renderView的连接。
修复后的代码
var renderView = RenderView() var movieInput: MovieInput! var selectedFilter: ImageProcessingOperation! func startVideoWithFilter(filter: ImageProcessingOperation) { let bundleURL = Bundle.main.resourceURL! let movieURL = URL(string:"fileName.mp4", relativeTo:bundleURL)! // 1. 彻底清理旧资源:停止旧MovieInput并断开所有连接 if let oldMovieInput = movieInput { oldMovieInput.stop() oldMovieInput.removeAllTargets() movieInput = nil // 让ARC回收旧实例 } // 2. 断开旧滤镜和renderView的连接 selectedFilter?.removeAllTargets() // 3. 初始化新的MovieInput并建立正确管线 do { movieInput = try MovieInput(asset: AVAsset(url: movieURL), playAtActualSpeed: true, loop: true) // 将新滤镜设为当前选中的滤镜 selectedFilter = filter // 建立管线:MovieInput -> 选中的滤镜 -> RenderView movieInput.addTarget(selectedFilter) selectedFilter.addTarget(renderView) movieInput.runBenchmark = true movieInput.start() } catch { print("Couldn't process movie with error: \(error)") } }
关键修复点解释
- 停止并销毁旧的MovieInput:调用
stop()让视频播放彻底停止,再把movieInput置为nil,确保旧实例被ARC回收,不会再占用任何节点连接。 - 正确断开旧滤镜的连接:通过
selectedFilter?.removeAllTargets(),确保上一次的滤镜和renderView的连接被彻底断开,避免renderView的输入端口被旧滤镜占用。 - 统一管理当前选中的滤镜:把传入的新滤镜赋值给
selectedFilter,确保后续清理时能准确找到需要断开的滤镜节点。
这样修改后,每次切换滤镜时旧管线会被彻底清理,新管线能正常建立,就不会再出现目标容量不足的警告,滤镜也能正常生效了。
内容的提问来源于stack exchange,提问作者Him bhatt
相关产品推荐
相关产品推荐

