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


86

是否可以使用ffmpeg不是从零开始的一系列序列创建视频?

例如,我有一些图像[test_100.jpg,test_101.jpg,test_102.jpg,...,test_200.jpg],我想将它们转换为视频。我尝试了以下命令,但是没有用(似乎数字应该从零开始):

ffmpeg -i test_%d.jpg -vcodec mpeg4 test.avi

有什么建议吗?


自问这个问题已经有一段时间了,但是如果您仍然对该问题感兴趣,答案是肯定的-我在下面发布了详细信息和示例:stackoverflow.com/a/12160155/181638
Assad Ebrahim

@casperOne有助于理解为什么这不是主题。似乎是一个特定的编程问题。ffmpeg的标签有3.7K追随者,并与27K的观点显然人们发现它有用..
geotheory

2
@geotheory标记统计信息无关。ffmpeg的是一个节目多在说,WinRAR的方式。尽管您可以针对ffmpeg中的进行编程,但这个问题并不关乎此。从超级用户询问在命令行中使用ffmpeg 的主题。
casperOne

Answers:


81

如果-start_number像这样使用开关,则无需重命名文件:

ffmpeg -start_number n -i test_%d.jpg -vcodec mpeg4 test.avi

n静止图像序列的开始位置在哪里。

请注意,只要序列一旦开始就不间断,这将起作用。如果存在间隙,并且您希望将所有静止图像都包括在内,则可能需要重新编号以填补间隙。

您可能还会发现其他一些有用的开关。

我使用以下单线来降低帧速率并压缩图像并生成较小的视频:

ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number 1234 -r 3 -i Imgp%04d.jpg -s 720x480 test.avi

-r 3选项将生成的视频的帧速率设置为每秒3帧,这样我就可以在短时间内看到每个静止帧。该-s选项将图片重新缩放到所需的分辨率,以管理生成的视频的大小。

(在Windows外壳程序,替换-i Imgp%04d.jpg-i "Imgp%%04d.jpg"。信用这个麦克帕特里克https://superuser.com/a/344178/153054


4
-r和-framerate有什么区别?

1
他们是同一个IIRC
rogerdpack

22
只要您乐于接受它们在(例如)“ ls”中出现的顺序,就无需对废话进行编号...只需使用:ffmpeg -pattern_type glob -i'*
.jpg'movie.mp4

2
是否有任何开关可以控制图像之间的时间间隔,例如,我想显示第一幅图像13s,第二幅图像15s,24s显示第三幅图像,时间间隔是用户定义的,可以吗?
zionpi '16


38

您可以在下面的代码段中使用此代码:

 cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4

这不会将JPG旋转到元数据中指定的旋转。
Erik Johansson

17

您可以在ffmpeg文档中找到示例脚本:

3.2如何将单张图片编码为电影?

如果要重命名的图片很多,可以使用以下命令减轻负担。该命令使用bourne shell语法,将与* jpg匹配的当前目录中的所有文件符号链接到/tmp' directory in the sequence ofimg001.jpg,img002.jpg等。

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

然后运行:

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg

2
您最好使x = 0开始,以便图像名称以img000.jpg开始,因为这是ffmpeg期望的。而且符号链接对我不起作用,因为ffmpeg找不到文件,所以我不得不改用cp(明显的速度和空间不足,但无论如何我还是要修复它们)。如果您不介意丢失原稿,则mv也可以使用。

请注意,在此答案中,提供的命令将创建硬链接,而不是符号链接。关于cpif链接不起作用的使用,如果您的文件系统支持,cp --reflink=auto它将获得更好的速度/空间使用率。
费利克斯Saparelli

12

ffmpeg的文档中:

使用全局模式

ffmpeg还支持bash样式的globbing(*表示任意数量的任何字符)。

如果您的图像是连续的,但不一定像前面的示例中那样按数字顺序排列,则这很有用。

ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4

因此,只要您的文件已排序,使用-pattern_type glob开关就可以为您工作。


请注意,此glob比常规的shell glob受到更多限制:trac.ffmpeg.org/ticket/3620显然是因为从扩展名推断出了图像类型。
Ciro Santilli新疆改造中心法轮功六四事件2016年

11

据我所知,您不能以随机数开始序列(我不记得是否应该以0或1开头),此外,它不能有间隔,如果有,ffmpeg会认为序列已结束并且停止添加更多图像。

另外,如对我的答案的评论所述,请记住,您需要指定索引的宽度。喜欢:

图片%03d.jpg

如果使用%03d索引类型,则需要用0填充文件名,例如:

image001.jpg image002.jpg image003.jpg

等等


1
如果图像文件名的前导零,则格式字符串还必须指定宽度,例如“%03d”。

1
如果这是唯一的障碍,则可以编写脚本以将图像重命名或符号链接到正确重新索引的集合。
卡斯卡贝尔

1
是的,我之前使用过它,前一段时间我在Ruby中编写了一个包装器,其中您调用instance.addImage(),然后调用instance.processVideo(),它将创建一个临时目录,使用适当的索引复制/重命名图像并创建视频。这很容易。

@Jefromi我创建了一个符号链接,但是如何将符号链接文件的路径指定给ffmpeg?它只是假设symlink文件是我要转换的图像?我在WIN7顺便说一句

序列可以从0到4(包括0和4)之间的任意位置开始。
阿萨德·易卜拉欣

5

我同意Francisco的观点,但是作为一种解决方法,您可以编写一个快速脚本来移动或创建具有ffmpeg所需序号的文件的符号链接。然后,脚本可以调用ffmpeg,然后删除链接或将文件移回其原始位置。


1

抬头

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i"
/tmp/img"$counter".jpg; x=$(($x+1)); done

1

我知道这是一个古老的问题,但我在Google寻找相同答案时遇到了这个问题。这里没有一个答案能使我完全满意,因此我进行了更多的搜索和阅读,这是我针对自己的问题提出的命令。

cat {0032..1501}*.png | ffmpeg -f image2pipe -framerate 5 -i - -s 720x480 test2.avi

我之所以使用这样的命令的原因是...

  1. Cat和-f image2pipe使您可以更好地控制使用的图像。例如,它允许您使用bash功能(如方括号扩展)和其他命令(如grep)来微调您的结果(如果您选择)。
  2. 记住的开关更少。
  3. 我建议不要使用-r,而应仅使用-framerate。以我的经验,-r倾向于丢帧更多。
  4. 不太复杂,没有使用不必要的开关,它将按原样工作。您可能会增加更多的复杂性(例如,指定编码器)并进行微调以满足您的需求。

对于OP的问题,-start_number仅此而已。
Gyan

0

我使用了flv编码器,因为我的视频正在使用Flash Player(Jwplayer)

ffmpeg -i%d.jpg -vcodec flv test.flv


0

文档中看来,您可以简单地使用*

For example, for creating a video from filenames matching the glob pattern foo-*.jpeg:

ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

需要注意的是,为了提高效果质量,速率/ fps可能很重要(例如,首先指定非常低/很高的帧速率,然后从第二个过滤器通过,该过滤器会使慢动作视频恢复正常吗?)


0

就我而言,由于文件中的数字,这有点棘手。这是我的图像的样子:

$ ls | head -5
2014_aq_unprocessed 001.jpg
2014_aq_unprocessed 002.jpg
2014_aq_unprocessed 003.jpg
2014_aq_unprocessed 004.jpg
2014_aq_unprocessed 005.jpg

这是我使用的命令:

ffmpeg -i 2014_aq_unprocessed\ %3d.jpg  -vcodec mpeg4 test.avi

0

您可以使用convert -morph

convert *.jpg -delay 10 -morph 10 %05d.jpg

如果要使用ffmpeg,我用

ffmpeg -pattern_type glob -i '*.jpg' -vf "setpts=10*PTS" movie.mp4

10*PTS告诉FFmpeg慢下来的10倍。您也可以在其中添加分数以加快速度。


这只是将您的原始图像序列插入到一个新的空间,而不会像要求的OP那样创建视频文件。
f0ster

0

-pattern_type glob 音频的具体例子

https://superuser.com/a/782520/128124上提到了此选项,但是这里有一些具体用法示例,包括在输出视频中添加音频。

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

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

等等。

另请参阅:http : //unix.stackexchange.com/questions/68770/converting-png-frames-to-video-at-1-fps/339399#339399

以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

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

在以下位置回答:如何将MP3转换为YouTube允许的视频格式?

获得一些综合测试输入图像

这些是我在此答案中一直使用的测试图像:

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

使用以下图像生成的图像:https : //stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

观察视频对图像序列的压缩方式要比ZIP压缩方式好得多,这是很酷的,因为它可以使用专门的算法跨帧进行压缩:

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

关于CLI选项

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

-r 30使-framerate 1视频达到30 FPS,以克服VLC等播放器中低帧率的错误:https : //stackoverflow.com/questions/19267443/playback-issues-in-vlc-with-low-fps-video-from-images-using- ffmpeg / 41797724#41797724因此,它每帧重复30次以保持每秒1张所需的图像效果。

下一步

您还将希望:

TODO:从命令行学习将多个音频文件剪切并连接到视频中:

经过测试

ffmpeg 3.4.4,vlc 3.0.3,Ubuntu 18.04。

参考书目

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.