FFmpeg filter_complex_script调用movie滤镜无法使用输入文件问题
问题背景
我尝试使用FFmpeg而非GUI编辑器剪辑视频素材。
以下可正常运行的示例功能为读取PNG文件,将缩放后的视频叠加在该图片之上:
ffmpeg -y \ -loop 1 -i 'Title.png' \ -i 'Presentation.mp4' \ -filter_complex_script 'my.nodes' \ -map "[video]" -map 1:a -codec:a copy output.mkv
其中 my.nodes 文件内容如下:
[1:v]scale=430:240[a]; [1:v]scale=1280:720[b]; [0:v][a]overlay=0:0[c]; [c][b]overlay=overlay_w*2:overlay_h:shortest=1[video]
我不希望通过数字索引(如1:v等)指代输入文件,想要使用movie滤镜作为源滤镜直接在滤镜配置里引入文件,对应调用方式如下:
ffmpeg -y \ -filter_complex_script 'my_improved.nodes' \ -map "[video]" output.mkv
其中 my_improved.nodes 文件内容如下:
movie=Title.png[title]; movie=Presentation.mp4[talk]; [talk]scale=430:240[a]; [talk]scale=1280:720[b]; [title][a]overlay=0:0[c]; [c][b]overlay=overlay_w*2:overlay_h:shortest=1[video]
运行该命令时出现如下报错:
Invalid file index 0 in filtergraph description movie=Title.png[title]; movie=Presentation.mp4[talk]; [talk]scale=430:240[a]; [talk]scale=1280:720[b]; [title][a]overlay=0:0[c]; [c][b]overlay=overlay_w*2:overlay_h:shortest=1[video] .
解决方案
报错来自两个配置疏漏:
- 原本通过
-loop 1给背景PNG设置的循环效果,在改用movie滤镜引入文件时没有配置,单帧图片无法匹配视频时长。 - 调用命令没有传入任何
-i输入项时,滤镜中加载视频的movie滤镜默认仅读取视频流,不会自动加载音频轨,同时需要显式指定音频源映射。
修正后的滤镜脚本my_improved.nodes内容:
movie=Title.png:loop=0,format=rgba[title]; movie=Presentation.mp4[talk]; amovie=Presentation.mp4[aout]; [talk]scale=430:240[a]; [talk]scale=1280:720[b]; [title][a]overlay=0:0[c]; [c][b]overlay=overlay_w*2:overlay_h:shortest=1[video]
对应执行命令:
ffmpeg -y \ -filter_complex_script 'my_improved.nodes' \ -map "[video]" -map "[aout]" -c:a copy output.mkv
配置说明:
- 给图片源添加
loop=0参数实现无限循环,和原命令-loop 1效果一致,配合overlay滤镜的shortest=1参数,会在主视频播放结束时自动终止编码,不会无限运行。 - 音频轨单独用
amovie滤镜加载,直接映射输出即可保留原命令的音频流复制逻辑,不需要重新编码音频。 - 如果文件名包含空格、冒号等特殊字符,用单引号包裹文件名即可,例如
movie='My Presentation.mp4'[talk]。
内容的提问来源于stack exchange,提问作者Nick Gammon
相关产品推荐
相关产品推荐

