如何使用FFmpeg从图像创建视频?
是否可以使用ffmpeg
从一组序列中创建一个视频,其中数字不是从零开始?
例如,我有一些图片[test100.jpg, test101.jpg, test102.jpg, …, test200.jpg],我想把它们转换为视频。我试了下面的命令,但没有成功(似乎数字应该从零开始):
ffmpeg -i test_%d.jpg -vcodec mpeg4 test.avi
有什么建议吗?
是否可以使用ffmpeg
从一组序列中创建一个视频,其中数字不是从零开始?
例如,我有一些图片[test100.jpg, test101.jpg, test102.jpg, …, test200.jpg],我想把它们转换为视频。我试了下面的命令,但没有成功(似乎数字应该从零开始):
ffmpeg -i test_%d.jpg -vcodec mpeg4 test.avi
有什么建议吗?
如果使用-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 )
你可以在 ffmpeg 文档 中找到一个示例脚本。
3.2 如何将单张图片编码成电影?
如果你有大量的图片需要重命名,你可以使用下面的命令来减轻负担。该命令采用伯恩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
然后运行。
ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
``` > 然后运行:
0x1&
来自 ffmpeg 的文档:
ffmpeg 也支持 bash 风格的 globbing (* 代表任何字符的任意数量)。
如果你的图像是按顺序排列的,但不一定像前面的例子那样按数字顺序排列,这就很有用。
ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4
所以,只要你的文件是按顺序排列的,使用-pattern_type glob
开关就可以了。
据我所知,你不能用随机数开始序列(我不记得你应该从0还是1开始),另外,它不能有空隙,如果有空隙,ffmpeg会认为序列已经结束并停止添加更多图像。
另外,正如我的答案的评论中所说,记得你需要指定索引的宽度。比如
image%03d.jpg
如果你使用%03d的索引类型,你需要用0来填充你的文件名,比如: :
image001.jpg image002.jpg image003.jpg
等等。
我知道这是个老问题,但我在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. 不太复杂,不需要使用不必要的开关,而且可以正常工作。你可以增加更多的复杂性(例如,指定编码器),并根据你的需要进行微调。
-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
这就是它的样子。
添加一些音频。
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上传视频
获取一些合成的测试输入图片
这是我在这个答案中一直使用的测试图片。
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.
参考书目
在我的情况下,它是一个有点棘手的,因为文件中的数字。下面是我的图像的样子。
$ 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
从文档,似乎你可以简单地使用 *
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可能是重要的(例如,首先指定非常低/高帧率,然后通过从第二个过滤器,将使慢动作视频正常?
你可以用 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倍。你也可以在那里有分数来加快它的速度。