简介
本文用ffmpeg实现了将多张图片和音频合成视频并额外添加bgm,大致分为如下步骤:
- 统一图片分辨率
- 读取每个音频时长
- 单张图片与单个音频合成视频
- 多个视频合成一个视频
- 为视频添加bgm
统一图片分辨率
ffmpeg -i a.png -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2" -y a_fixed.png
各参数介绍
- -i 输入文件
- -vf 滤镜
- scale:将图片等比例缩放为1080(宽)*1920(高) 并且用黑边填充
- -y 指定输出地址,如果输出地址存在则强制覆盖原文件而不询问
scale参数的几种用法
- scale=-1:1920 将视频的高度固定为1920像素,宽度等比例缩放
- scale=1080:-1 将视频的宽度固定为1080像素,高度等比例缩放
- scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2 将视频等比例缩放为宽1280,高720像素并填充黑边
读取音视频时长(秒)
ffmpeg -i 1.mp3 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//
注意:上述指令的输出结果为浮点型
执行ffmpeg -i 1.mp3后的结果
参数说明
- cut -d ’ ’ -f 4 按照’ '分割并取第四个元素,索引从1开始
- 将字符串,替换为空
图片与音频合成视频
单张图片和音频合成一个视频,视频时长为音频时长加音频结束后的静音时长
加入静音时长的目的是为了在将两个视频合并时,画面切换时不显得突兀,如果不需要静音时长,只需要将视频时长设置为音频时长即可。
ffmpeg -i 1.png -i 1.mp3 -af apad -vf "[0:v]scale=1080x1920,zoompan=z='min(zoom+0.0015,1.5)':d=112.5:s=1080x1920:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)',setpts=PTS-STARTPTS" -pix_fmt yuv420p -c:v libx264 -t 4.5 -y 1.mp4
参数说明
- -af apad 当音频时长小于视频时长时,在音频结束后添加静音
- scale=1080x1920: 将图片缩放到指定的尺寸(宽度和高度)
- zoompan: 创建缩放和平移效果
- z=‘min(zoom+0.0015,1.5)’ 每帧聚焦0.0015倍,最大聚焦1.5倍
- d=112.5 每张图片的持续时间。 视频每秒25帧,因此图片持续时间m秒即为25*m
- s=1080x1920 输出视频的尺寸
- x=‘iw/2-(iw/zoom/2)’:y='ih/2-(ih/zoom/2) 聚焦到中心点(对角线中心)
- 这个过滤器用来调整时间戳,使得输出的视频从0开始
- -pix_fmt yuv420p: 设置输出视频的像素格式为yuv420p,这是大多数视频播放器都支持的格式。
- -c:v libx264: 设置视频编码器为libx264,这是一个广泛使用的H.264编码器。
- -t : 输出视频的时长(秒)
多个视频合成一个长视频
首先我们需要将要合成的视频放在同一个文件夹下,并在此文件夹中创建一个concat.txt文件。
concat.txt文件内容为我们要合成长视频的每个短视频如:
file 1.mp4
file 2.mp4
合成命令
ffmpeg -f concat -safe 0 -i concat.txt -c copy -y final.mp4
参数说明
-safe 0 是否检查文件路径的安全性。如果设置为0,ffmpeg 将不检查文件路径的安全性。这在处理包含特殊字符或非本地文件路径的文件时可能很有用。在默认情况下,-safe 的值为1,这意味着 ffmpeg 会检查文件路径的安全性。
为视频添加bgm
ffmpeg -i final.mp4 -stream_loop -1 -i bgm.mp3 -filter_complex "[1:a]volume=0.5[1a];[0:a][1a]amix=inputs=2:duration=first:dropout_transition=2" -vcodec copy -y final_bgm.mp4
参数解读
- -stream_loop -1 循环,当number为-1时表示无限循环
- -filter_complex 复杂的音频混合滤镜,已有音频流的视频添加bgm必须使用此滤镜
- [1:a]volume=%f[1a]:调整背景音乐的音量。[1:a] 指的是第二个输入文件(即 bgm.mp3)的音频流,volume=%f 是一个音频滤镜,用于调整音量,%f 是音量的具体值,[1a] 是处理后的音频流的标签。
- [0:a][1a]amix=inputs=2 将第一个音频与第二个处理后的音频混合
- duration=first 视频时长为第一个输入的时长
- dropout_transition 是 amix 滤镜在 ffmpeg 中的一个选项。这个选项用于控制当一个或多个输入流结束时,剩余的输入流的过渡时间。单位是秒。例如,假设你有两个音频流 A 和 B。A 比 B 短,所以在混合过程中,A 会先结束。如果 dropout_transition 设置为 2 秒,那么当 A 结束后,B 的音量会在接下来的 2 秒内平滑过渡到其原始音量。
-vcodec copy:指定视频编解码器为 copy,直接复制输入视频的数据,而不进行重新编码。这可以避免数据的损失,并且处理速度更快