使用 FFMPEG 从具有不同图像持续时间的图像和音频创建视频?

Muh*_*mer 3 terminal ffmpeg video-streaming

我想做的事:

我有 x 数量的图像 png/jpg,我想显示它们的持续时间不同,有些更长,有些时间更短。

  • a1.jpg 第一张照片停留 3 秒
  • a2.png 停留 10 秒
  • a3.jpg 一直保持到音频结束

视频应该和audio.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
Run Code Online (Sandbox Code Playgroud)

尝试

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
Run Code Online (Sandbox Code Playgroud)

Gya*_*yan 6

基本模板是

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
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

W 和 H 应替换为目标视频宽度和高度的数值。