关于在MLT中添加多输入自定义FFmpeg AVFilter的技术咨询
关于MLT不识别多输入AVFilter的问题解答
1. MLT为何不支持多输入AVFilter?
MLT核心架构最初围绕非线性编辑的单轨/单输入滤镜流程设计,滤镜系统默认绑定单个上游媒体生产者,对多输入资源的同步、调度逻辑支持不足。同时AVFilter的多输入节点模型与MLT的轨道/clip管理模型存在适配门槛,加上历史上社区对多输入AVFilter的需求优先级不高,因此MLT没有原生支持这类滤镜。
2. 代码中何处限制了该功能?
核心限制集中在MLT的AVFilter模块实现中:
- 滤镜注册逻辑:在
src/modules/avfilter/filter_avfilter.c的filter_avfilter_init函数里,会检查AVFilter的输入端口数量,若filter->nb_inputs != 1,则跳过该滤镜的注册流程; - 帧处理逻辑:
mlt_filter_process函数默认仅处理单个输入帧,未实现多输入帧的同步获取与传递逻辑; - 结构体设计:MltFilter核心结构体没有存储多输入生产者的字段,无法同时绑定多个上游媒体源;
- 探针逻辑:
avfilter_probe函数会过滤掉多输入的AVFilter,不会将其纳入MLT的滤镜元数据列表。
3. 添加该滤镜的最佳方式是什么?
根据需求场景,有两种主流方案:
方案一:快速适配(无需修改MLT源码)
在FFmpeg层面将你的多输入滤镜包装为单输入滤镜:通过FFmpeg滤镜链,把第二个输入源用movie滤镜加载后作为参数传入自定义滤镜,或是将多输入逻辑封装为单输入的复合滤镜。这样MLT可直接识别包装后的滤镜,无需修改MLT代码。
方案二:原生支持(修改MLT源码,长期复用)
若需要长期支持多输入AVFilter,可修改MLT的AVFilter模块:
- 修改
filter_avfilter.c中的注册逻辑,允许nb_inputs > 1的AVFilter被注册; - 扩展MltFilter结构体,添加存储多输入生产者的字段;
- 实现多输入帧的同步逻辑,等待所有输入源的帧就绪后,再调用AVFilter的处理函数;
- 调整
mlt_filter_process的逻辑,支持多输入帧的传递与处理。
备选方案
如果滤镜逻辑不复杂,也可直接基于MLT原生API开发多输入滤镜,完全绕过AVFilter的适配问题。
内容的提问来源于stack exchange,提问作者Shivam gupta
相关产品推荐
相关产品推荐

