我想做的事:
我有 x 数量的 png/jpg 图像,我想以不同的持续时间显示它们,有的持续时间较长,有的持续时间较短。
- a1.jpg 第一张照片停留3秒
- a2.png 停留 10 秒
- a3.jpg 保留到音频结束
视频应该与音频.mp3一样长
这是我阅读文档后迄今为止的代码,不确定哪里出了问题,我得到了没有声音的损坏视频并且只显示最后一幅图像。
如果可能的话,也希望将图像置于中心。
ffmpeg -y \
-loop 1 -t 1 -i a1.jpg \
-loop 1 -t 1 -i a2.jpg \
-loop 1 -t 4 -i a3.jpg \
-loop 1 -t 1 -i a4.png \
-loop 1 -t 1 -i a5.png \
-i audio.mp3 \
-c:v libx264 -pix_fmt yuv420p -c:a copy video.mp4
尝试
ffmpeg -y -framerate 15 \
-loop 1 -t 1 -i a1.jpg \
-loop 1 -t 1 -i a2.jpg \
-loop 1 -t 4 -i a3.jpg \
-loop 1 -t 1 -i a4.png \
-loop 1 -t 1 -i a5.png \
-i audio.mp3 \
-c:v libx264 -pix_fmt yuv420p -c:a copy \
-filter_complex " \
[0]setdar=16/9[a1],[a1]scale=720x406[a];[1]setdar=16/9[b1],[b1]scale=720x406[b];[2]setdar=16/9[c1],[c1]scale=720x406[c];[3]setdar=16/9[d1],[d1]scale=720x406[d];[4]setdar=16/9[e1],[e1]scale=720x406[e];
[a][b][c][d][e]concat=n=5,format=yuv420p[v],[v]scale=720x406[v1],[v1]setdar=16/9[v2]" \
-map "[v2]" -c:a copy out.mp4
答案1
基本模板是
ffmpeg -y \
-loop 1 -t 1 -i a1.jpg \
-loop 1 -t 1 -i a2.jpg \
-loop 1 -t 4 -i a3.jpg \
-loop 1 -t 1 -i a4.png \
-loop 1 -i a5.png \
-i audio.mp3 \
-filter_complex "concat=n=5" -shortest \
-c:v libx264 -pix_fmt yuv420p -c:a aac video.mp4
t
每幅图像的规格设定了其持续时间。如果t
您希望视频持续到音频结束,则应省略最后一幅图像的规格。
我使用 concat 过滤器连接所有视频输入。好的做法是标记 concat 过滤器将连接的输入,但如果未指定,过滤器将抓取前 N 个-i
输入,其中 N 是 concat 过滤器中设置的值。所有图像必须具有相同的分辨率和宽高比。
您给出的命令会复制音频,但是虽然允许使用 MP3,但它不是 MP4 的标准,并且某些播放器(如 Quicktime)不会播放该文件,因此我将其更改为 AAC。
对于大小不等的图像,将 filter_complex 更改为
"[0]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i0];
[1]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i1];
[2]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i2];
[3]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i3];
[4]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i4];
[i0][i1][i2][i3][i4]concat=n=5"
W 和 H 应该替换为目标视频宽度和高度的数值。