在 ffmpeg 中从单个图像创建特定持续时间的视频

如何使用 ffmpeg 生成一个具有特定分辨率的单个图像(image 1.png) ,持续时间为15秒,这样当我播放视频时,图像将在屏幕上显示15秒。

98901 次浏览
ffmpeg -loop 1 -i image.png -c:v libx264 -t 15 -pix_fmt yuv420p -vf scale=320:240 out.mp4
  • 15秒就是15秒。
  • Vf 刻度 = 320:240设置 宽度/高度。

确保使用最新的 ffmpeg 版本,例如 http://johnvansickle.com/ffmpeg/

发现这个更快:

ffmpeg -framerate 1/10 -i DJI_0024.JPG -c:v libx264 -t 10 -pix_fmt yuv420p -vf scale=320:240 out.mp4

- t 10使视频长10秒,设置帧率1/10。帧率的除数应该和-t 的参数相同。 这使得一个大分辨率的 jpeg 转换为视频在不到一秒的时间内为我,而另一个答案大约需要40秒。 另外,由此产生的文件大小也变得稍微小了一些,从3.38 MB 变成了3.17 MB

请注意吹你的视频大小只有一个图像! 这样做: 在参数 -r 0.01中使用 ffmpeg 几乎没有帧速率,这使得文件缩小了约65% 但是您可能还需要削减这个参数 -ss 00:00:00 -t 00:00:27的长度

这是我的密码:

ffmpeg -r 0.01 -loop 1 -i image.jpg -i audio.mp3 -c:v libx264 -tune stillimage -preset  ultrafast -ss 00:00:00 -t 00:00:27   -c:a aac  -b:a 96k -pix_fmt yuv420p  -shortest out.mp4 -y

对于 高品质编码速度(在这里与 HEVC 一起显示,选择 codec 和它的 codec 特定设置,以便在用例中兼容) :

ffmpeg -framerate 30 -i input.jpg -t 15 \
-c:v libx265 -x265-params lossless=1 \
-pix_fmt yuv420p -vf "scale=3840:2160,loop=-1:1" \
-movflags faststart \
out.mp4
  • -framerate 30而不是默认的25fps
  • -t 15视频持续时间15秒
  • -c:v libx265使用 h.265(HEVC)进行编码
  • -x265-params lossless=1无损编码,防止静止图像的伪影。与视频不同,图像将显示足够长的时间来注意工件
  • -pix_fmt yuv420p设置像素格式的兼容性,因为输入是一个图像(JPEG 通常是 YUV444,许多解码器不会接受)
  • -vf "<options>"集视频滤波器
  • scale=3840:2160特别缩放到3840x2160(4K)
    • 如果您的输入不是 没错16:9(或者不管您的目标比率是多少) ,那么您将需要使用 3840:-1-1:2160。这将防止由于无意的纵横比变化而导致的重大模糊。转而查看 ABC2或 crop,如果你必须有一个精确的分辨率,不匹配的比例输入。
  • 对于1帧(1)的组,loop=-1:1无限循环(- 1)
  • movflags faststart将元数据放在文件前面,以便在浏览器中更快地播放。

我在一个云/无服务器的环境中运行它,因此最小化运行时是关键。我尝试了低帧率的方法,但它没有发挥在我的目标环境或本地的 VLC。

-vf loop选项循环这里的一帧。它将帧保存在内存中,这也是为什么 主要原因比其他答案更快,同时比分数帧率方法更兼容的原因。