Node fluent-ffmpeg如何实现视频居中、添加内边距及背景图片
fluent-ffmpeg 实现视频居中叠加自定义背景方案
你原有代码使用autopad只能生成纯色填充背景,无法替换为自定义图片,且两次转码会带来额外的画质损耗。可以通过复合滤镜一次性完成需求,实现逻辑如下:
const ffmpeg = require('fluent-ffmpeg'); // 按需替换以下路径 const inputVideoPath = '你的输入视频本地路径'; const customBgPath = '你的自定义背景图本地路径(建议提前调整为1920*1080尺寸)'; const finalOutputPath = '最终输出视频保存路径'; ffmpeg() // 加载自定义背景图,设置循环适配视频时长 .input(customBgPath) .inputOptions(['-loop 1']) // 加载待处理的原视频 .input(inputVideoPath) .complexFilter([ // 第一步:将视频缩放到640*480,保持原比例不变形 { filter: 'scale', options: { w: 640, h: 480, force_original_aspect_ratio: 'decrease' }, inputs: '1:v', outputs: 'scaled_video' }, // 第二步:将缩放后的视频填充到刚好640*480尺寸,空白处用粉色填充(可自行修改颜色) { filter: 'pad', options: { w: 640, h: 480, x: '(ow - iw) / 2', y: '(oh - ih) / 2', color: 'pink' }, inputs: 'scaled_video', outputs: 'padded_video' }, // 第三步:将处理好的视频居中叠加到1920*1080的背景图上 { filter: 'overlay', options: { x: '(main_w - overlay_w) / 2', y: '(main_h - overlay_h) / 2' }, inputs: ['0:v', 'padded_video'], outputs: 'final_video' } ]) // 映射输出流:视频用合成后的流,音频直接复用原视频音频 .outputOptions([ '-map final_video', '-map 1:a', '-c:v libx264', '-c:a aac', // 强制输出时长和原视频一致,避免背景图循环导致无限生成 '-shortest' ]) .on('error', err => { console.log('处理出错:' + err.message); }) .on('end', () => { console.log('处理完成!'); }) .save(finalOutputPath);
注意事项
- 如果你的背景图未提前调整为1920*1080,可在复合滤镜的最开头新增背景图缩放节点,将背景图先缩放到目标尺寸即可
- 如果不需要视频缩放后的粉色填充,可将pad滤镜的color参数设置为
#00000000(透明色)即可 - 本方案无需生成中间临时文件,仅一次转码即可完成所有处理,性能和画质表现都优于多次转码的实现
内容的提问来源于stack exchange,提问作者seikida
相关产品推荐
相关产品推荐

