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

111 linux ffmpeg

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

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

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

有什么建议吗?

Ass*_*him 100

如果使用-start_number开关,则无需重命名文件,如下所示:

ffmpeg -start_number n -i test_%d.jpg -vcodec mpeg4 test.avi
Run Code Online (Sandbox Code Playgroud)

n剧照序列的起点在哪里。

请注意,只要序列在开始后不间断,这将起作用。如果存在空白并且您希望包含所有剧照,则可能需要重新编号以填补空白。

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

我使用以下单行代码来获得较慢的帧速率并压缩图像并生成较小的视频:

ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number 1234 -r 3 -i Imgp%04d.jpg -s 720x480 test.avi
Run Code Online (Sandbox Code Playgroud)

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

(在 Windows shell 中,替换-i Imgp%04d.jpg-i "Imgp%%04d.jpg". 将此归功于 Mike Fitzpatrick https://superuser.com/a/344178/153054

  • 无需编号废话,只要您愿意接受它们出现在(例如)'ls' 中的顺序...只需使用:ffmpeg -pattern_type glob -i '*.jpg' movie.mp4 (32认同)
  • -r 和 -framerate 有什么区别? (4认同)
  • 是否有任何开关来控制图像之间的**时间**间隔,比如说,我想显示第一张图像 13 秒,第二张 15 秒,第三张图像显示 24 秒,时间间隔是用户定义的,这可能吗? (2认同)
  • 另见 https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images (2认同)

小智 41

您可以使用以下代码片段:

 cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4
Run Code Online (Sandbox Code Playgroud)


Nev*_*ams 25

来自ffmpeg 的文档:

使用全局模式

ffmpeg 还支持 bash 风格的通配符(* 代表任意数量的任意字符)。

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

ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4
Run Code Online (Sandbox Code Playgroud)

因此,只要您的文件已排序,使用-pattern_type glob开关就应该适合您。


小智 19

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

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

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

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

然后运行:

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
Run Code Online (Sandbox Code Playgroud)

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

小智 11

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

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

图片%03d.jpg

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

image001.jpg image002.jpg image003.jpg

等等。


小智 5

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


Cir*_*郝海东 5

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

添加一些音乐,在图像结束时关闭音频:

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

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

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

0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg
Run Code Online (Sandbox Code Playgroud)

等等。

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

这是它的样子:

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

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

生成的图像: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 模式那样通用,例如:-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 张图像的效果。

下一步

您还需要:

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

经过测试

ffmpeg 3.4.4、vlc 3.0.3、Ubuntu 18.04。

参考书目


归档时间:

查看次数:

260780 次

最近记录:

6 年 前