Melt框架:实现视频间背景图持久化显示
解决Melt中用PNG替代16:9视频黑边的问题
要实现用PNG图片替代16:9视频的黑边,核心是把视频轨道叠加在PNG背景轨道上,通过affine滤镜精确控制视频的缩放和位置,同时保留原有的视频转场效果。以下是具体的实现步骤和命令:
完整示例命令
假设你的背景图为bg.png,视频文件是vid_1.mp4和vid_2.mp4,输出文件为finish.mp4,命令如下:
melt bg.png -loop 1 \ -track vid_1.mp4 vid_2.mp4 -mix 30 -mixer luma \ -filter affine:transition.scale=0.75:transition.x=0:transition.y=135 \ -consumer avformat:finish.mp4 vcodec=libx264 acodec=aac width=1440 height=1080
参数详解
1. 背景轨道设置
bg.png -loop 1:将PNG作为第一个轨道,-loop 1让背景图循环播放,直到所有视频轨道结束,避免背景提前终止。
2. 视频轨道与转场
-track vid_1.mp4 vid_2.mp4 -mix 30 -mixer luma:创建第二个轨道,加载两个视频并添加30帧的亮度转场,保留你原有的转场逻辑。
3. Affine滤镜配置
affine滤镜用于缩放并定位视频到背景的指定位置,参数需根据背景图分辨率和视频分辨率计算:
- 计算缩放比例:
scale = min(背景宽度/视频宽度, 背景高度/视频高度),确保视频完整显示且保持16:9比例 - 计算缩放后视频尺寸:
缩放后宽度=视频宽度×scale,缩放后高度=视频高度×scale - 计算居中位置:
x=(背景宽度-缩放后宽度)/2,y=(背景高度-缩放后高度)/2
示例中,背景为1440×1080(4:3),视频为1920×1080(16:9):
scale=1440/1920=0.75缩放后高度=1080×0.75=810y=(1080-810)/2=135,x=0(视频宽度缩放后刚好匹配背景宽度,无需横向偏移)
4. 输出配置
width=1440 height=1080:指定输出分辨率与背景图一致,避免拉伸或黑边。vcodec=libx264 acodec=aac:指定常用的视频/音频编码,保证兼容性。
常见问题排查
如果affine滤镜未生效,检查以下几点:
- 滤镜应用对象:确保
-filter affine紧跟在-track之后,仅对视频轨道生效(而非背景轨道)。 - 参数格式:参数用冒号分隔,键值对无空格,例如
transition.scale=0.75而非transition.scale = 0.75。 - 背景图分辨率:输出分辨率必须与背景图一致,否则会导致视频位置偏移。
- 循环设置:背景轨道必须加
-loop 1,否则背景仅播放一帧就停止。
内容的提问来源于stack exchange,提问作者Marcelo
相关产品推荐
相关产品推荐

