2010-05-13 17:58:09 +0000 2010-05-13 17:58:09 +0000
89
89
Advertisement

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

Advertisement

是否可以使用ffmpeg从一组序列中创建一个视频,其中数字不是从零开始?

例如,我有一些图片[test100.jpg, test101.jpg, test102.jpg, …, test200.jpg],我想把它们转换为视频。我试了下面的命令,但没有成功(似乎数字应该从零开始):

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

有什么建议吗?

Advertisement
Advertisement

答案 (10)

84
84
84
2012-08-28 13:19:14 +0000

如果使用-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"。这要归功于 Mike Fitzpatrick https://superuser.com/a/344178/153054 )

17
17
17
2010-07-18 17:02:21 +0000

你可以在 ffmpeg 文档 中找到一个示例脚本。

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

如果你有大量的图片需要重命名,你可以使用下面的命令来减轻负担。该命令采用伯恩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
``` > 然后运行: 

0x1&
14
Advertisement
14
14
2014-07-13 07:11:20 +0000
Advertisement

来自 ffmpeg 的文档:

使用 glob 模式

ffmpeg 也支持 bash 风格的 globbing (* 代表任何字符的任意数量)。

如果你的图像是按顺序排列的,但不一定像前面的例子那样按数字顺序排列,这就很有用。

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

所以,只要你的文件是按顺序排列的,使用-pattern_type glob开关就可以了。

11
11
11
2010-05-13 18:15:35 +0000

据我所知,你不能用随机数开始序列(我不记得你应该从0还是1开始),另外,它不能有空隙,如果有空隙,ffmpeg会认为序列已经结束并停止添加更多图像。

另外,正如我的答案的评论中所说,记得你需要指定索引的宽度。比如

image%03d.jpg

如果你使用%03d的索引类型,你需要用0来填充你的文件名,比如: :

image001.jpg image002.jpg image003.jpg

等等。

5
Advertisement
5
5
2010-05-13 18:23:37 +0000
Advertisement

我同意Francisco的观点,但作为一个变通的办法,你可以写一个快速的脚本来移动或创建带有ffmpeg所需序列号的文件的符号链接,然后脚本可以调用ffmpeg,然后删除链接或将文件移回原处。脚本可以调用ffmpeg,然后删除链接或将文件移回原来的位置。

2
2
2
2016-08-03 23:44:55 +0000

我知道这是个老问题,但我在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. 不太复杂,不需要使用不必要的开关,而且可以正常工作。你可以增加更多的复杂性(例如,指定编码器),并根据你的需要进行微调。

0
Advertisement
0
0
2019-08-22 09:59:39 +0000
Advertisement

-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上的演示。

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: 340K
  • opengl-rotating-triangle.zip: 7.3M

关于CLI选项

不过请注意,尽管名字叫-glob,但它并不像shell Glob patter那样通用,例如: -i '*'失败。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张图像的效果。

接下来的步骤

你还会想要。

-剪切一些音频以匹配视频长度: https://stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpeg

-添加剪切后的音频。如何在ffmpeg中合并音频和视频文件

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

上测试

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

参考书目

0
0
0
2017-10-30 18:28:51 +0000

在我的情况下,它是一个有点棘手的,因为文件中的数字。下面是我的图像的样子。

$ 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
Advertisement
0
0
2016-01-29 12:05:41 +0000
Advertisement

文档,似乎你可以简单地使用 *

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
0
0
2016-01-14 23:22:34 +0000

你可以用 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倍。你也可以在那里有分数来加快它的速度。

Advertisement

相关问题

6
10
5
37
2
Advertisement
Advertisement