如何使用FFmpeg从图像创建视频?


163
ffmpeg -r 1/5 -start_number 2 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

这行工作正常,但我想从另一个文件夹中的图像创建视频文件。我的文件夹中的图像名称为:

img001.jpg
img002.jpg
img003.jpg
...

如何输入其他文件夹中的图像文件?例:C:\mypics

我尝试了此命令,但只ffmpeg生成了带有第一个图像(img001.jpg)的视频。

ffmpeg -r 1/5 -start_number 0 -i C:\myimages\img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Answers:


167

请参阅从图像创建视频幻灯片放映– FFmpeg

如果您的视频无法正确显示帧如果遇到问题(例如,第一张图像被跳过或仅显示一帧),请使用fps视频过滤器代替-r来输出帧率

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4

或者,可以将格式视频过滤器添加到过滤器链,以替换-pix_fmt yuv420p,例如“ fps = 25,format = yuv420p”。这种方法的优点是您可以控制哪个过滤器优先

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" out.mp4

我测试了以下参数,它对我有用

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -vf "fps=25,format=yuv420p" e:\out.mp4

以下参数也可以使用,但始终会跳过第一张图片

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -r 30 -pix_fmt yuv420p e:\out.mp4

从放置在不同文件夹中的图像制作视频

首先,如下所示将图像路径添加到imagepaths.txt

# this is a comment details https://trac.ffmpeg.org/wiki/Concatenate

file 'E:\images\png\images__%3d.jpg'
file 'E:\images\jpg\images__%3d.jpg'

用法示例如下:

"h:\ffmpeg\ffmpeg.exe" -y -r 1/5 -f concat -safe 0 -i "E:\images\imagepaths.txt" -c:v libx264 -vf "fps=25,format=yuv420p" "e:\out.mp4"

-safe 0参数可防止出现不安全的文件名错误

相关链接

FFmpeg用放置在不同文件夹中的图像制作视频

FFMPEG中级指南/图像序列

串联– FFmpeg


「如果您的影片无法正确显示影格,如果遇到问题,例如第一张图像被跳过或只显示一帧,请改用fps影片滤镜。」很抱歉,请您解释一下「fps」的意思。视频过滤器”到底是什么?
arnuschky 2014年

3
据我所知,-r参数是可变帧率,这意味着FFMPEG可能会丢弃或复制帧以获得所需的输出帧率。使用fps过滤器时,“-vf fps = value”会强制FFMPEG产生恒定的帧速率。请参阅从图像创建视频幻灯片放映– FFmpeg,这-r和fps过滤器之间的(技术上)区别是什么?。因此,使用-r有时参数职高跳过第一形象..

该列表上的第一个命令ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4似乎可以正常运行,但最终导致了一个视频,该视频是任何播放器(在Ubuntu上)都不可读的。VNC说,“找不到Moov原子”。尝试通过qt-faststart产生错误“文件中的最后一个原子不是moov原子” 来纠正此问题
sh37211

146

-pattern_type glob

在许多情况下,此出色的选项使选择图像更加容易。

每秒一幅图像的幻灯片视频

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
  -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

向其中添加一些音乐,当图像结束时可能会更长的音频时,将中断播放:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

这是YouTube上的两个演示:

成为嬉皮士,并使用Theora专利保护的视频格式

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libtheora -r 30 -pix_fmt yuv420p out.ogg

您的图片当然应该按字母顺序排序,通常为:

0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg

等等。

我还要首先确保所有要使用的图像具有相同的纵横比,可能与裁剪他们imagemagicknomacs提前,这样的ffmpeg将不必作出艰难的决定。特别是,宽度必须被2整除,否则转换失败并显示:“宽度不能被2整除”。

以30 FPS每帧一幅图像的标准速度视频

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -c:v libx264 -pix_fmt yuv420p out.mp4

看起来是这样的:

生成的GIF:https//askubuntu.com/questions/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

向其中添加一些音频:

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -i audio.ogg -c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out.mp4

结果:https : //www.youtube.com/watch?v=HG7c7lldhM4

这些是我使用的测试媒体:

wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg

使用以下方法生成的图像:如何使用GLUT / OpenGL渲染到文件?

观察视频对图像序列的压缩方式要好于ZIP,这是很酷的,因为它可以使用特殊算法对帧进行压缩:

  • opengl-rotating-triangle.mp4:34万
  • opengl-rotating-triangle.zip:730万

将一个音乐文件转换为带有固定图像的视频,以便YouTube上传

在以下位置回答:https : //superuser.com/questions/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572

逐步进行完整的逼真的幻灯片案例研究设置

除了运行单个ffmpeg命令之外,创建幻灯片还需要做更多的工作,因此这里有一个受时间轴启发的更有趣的详细示例。

获取输入媒体:

mkdir -p orig
cd orig
wget -O 1.png https://upload.wikimedia.org/wikipedia/commons/2/22/Australopithecus_afarensis.png
wget -O 2.jpg https://upload.wikimedia.org/wikipedia/commons/6/61/Homo_habilis-2.JPG
wget -O 3.jpg https://upload.wikimedia.org/wikipedia/commons/c/cb/Homo_erectus_new.JPG
wget -O 4.png https://upload.wikimedia.org/wikipedia/commons/1/1f/Homo_heidelbergensis_-_forensic_facial_reconstruction-crop.png
wget -O 5.jpg https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Sabaa_Nissan_Militiaman.jpg/450px-Sabaa_Nissan_Militiaman.jpg
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg
cd ..

# Convert all to PNG for consistency.
# /unix/29869/converting-multiple-image-files-from-jpeg-to-pdf-format
# Hardlink the ones that are already PNG.
mkdir -p png
mogrify -format png -path png orig/*.jpg
ln -P orig/*.png png

现在,我们快速浏览所有图像尺寸,以决定最终的宽高比:

identify png/*

输出:

png/1.png PNG 557x495 557x495+0+0 8-bit sRGB 653KB 0.000u 0:00.000
png/2.png PNG 664x800 664x800+0+0 8-bit sRGB 853KB 0.000u 0:00.000
png/3.png PNG 544x680 544x680+0+0 8-bit sRGB 442KB 0.000u 0:00.000
png/4.png PNG 207x238 207x238+0+0 8-bit sRGB 76.8KB 0.000u 0:00.000
png/5.png PNG 450x600 450x600+0+0 8-bit sRGB 627KB 0.000u 0:00.000

因此经典的480p(640x480 == 4/3)长宽比似乎合适。

进行一次转换,以最小的调整大小来使宽度均匀(TODO可以自动调整任何宽度,这里我只是手动查看identify输出,并将宽度和高度减少一):

mkdir -p raw
convert png/1.png -resize 556x494 raw/1.png
ln -P png/2.png png/3.png png/4.png png/5.png raw
ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p raw.mp4

这会产生可怕的输出,因为从以下位置可以看到:

ffprobe raw.mp4

ffmpeg仅采用第一个图像的大小556x494,然后将所有其他图像转换为该确切大小,从而破坏了它们的长宽比。

现在,让我们根据ImageMagick进行裁剪,将图像自动转换为目标480p宽高比:如何最小化图像到特定的宽高比?

mkdir -p auto
mogrify -path auto -geometry 640x480^ -gravity center -crop 640x480+0+0 png/*.png
ffmpeg -framerate 1 -pattern_type glob -i 'auto/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p auto.mp4

因此,现在的宽高比不错,但是不可避免地必须进行一些裁剪,以裁剪图像中有趣的部分。

另一种选择是使用黑色背景填充,使其具有与如下所示相同的纵横比:调整大小以适合盒子,并将“空”部分的背景设置为黑色

mkdir -p black
ffmpeg -framerate 1 -pattern_type glob -i 'black/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p black.mp4

通常来说,理想情况下,您将能够选择具有相同或相似长宽比的图像,从而首先避免出现这些问题。

关于CLI选项

但是请注意,尽管有这个名称,-glob但它不像Shell Glob模式那样通用,例如:-i '*'failed:https : //trac.ffmpeg.org/ticket/3620(显然是因为文件类型是从扩展名推导出的)。

-r 30使-framerate 1视频达到30 FPS,以克服VLC等播放器中的低帧率错误:VLC冻结从ffmpeg图像创建的低1 FPS视频,因此,它每帧重复30次以保持每秒1张所需的图像效果。

下一步

您还将希望:

TODO:学习将多个音频文件剪切并连接到视频中而没有中间文件的情况,我很确定这是可能的:

经过测试

ffmpeg 3.4.4,vlc 3.0.3,Ubuntu 18.04。

参考书目


如果使用python和subprocess.call启动ffmpeg,则不应'在输入和输出文件名中使用单引号。否则,它将找不到文件。
RunOrVeith

这对我来说很棒,但是我从npm软件包构建的版本ffmpeg-static没有实现glob。(Pattern type 'glob' was selected but globbing is not supported by this libavformat build
塞比

-pix_fmt引起的Trailing options were found on the commandline.错误
Anthony Kong

@AnthonyKong我现在无法ffmpeg -framerate 1 -pattern_type glob -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4在Ubuntun 19.10 ffmpeg 4.1.4上重现,您的版本和确切命令是什么?
西罗Santilli郝海东冠状病六四事件法轮功

20

文档的简单版本

对于Google Earth Studio图像特别有用:

ffmpeg -framerate 24 -i Project%03d.png Project.mp4

1
无法播放此输出:[h264 @ 0x7f148cc3cc40]硬件加速器无法解码图片
Bram

嗨,我如何执行该命令,我只是发现您能帮助我吗?
无辜的

@Innocent从您的终端或控制台。
Joshua Pinter

知道了,但是project%3d.png没在名为Project001.png,Project002.png的文件夹中选择我的所有图像,依此类推,它只能得到2张图片,我应该怎么做才能获取所有图片并将其转换为视频
天真的

您在使用%3d还是%03d
Joshua Pinter

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.