是否可以使用ffmpeg
不是从零开始的一系列序列创建视频?
例如,我有一些图像[test_100.jpg,test_101.jpg,test_102.jpg,...,test_200.jpg],我想将它们转换为视频。我尝试了以下命令,但是没有用(似乎数字应该从零开始):
ffmpeg -i test_%d.jpg -vcodec mpeg4 test.avi
有什么建议吗?
是否可以使用ffmpeg
不是从零开始的一系列序列创建视频?
例如,我有一些图像[test_100.jpg,test_101.jpg,test_102.jpg,...,test_200.jpg],我想将它们转换为视频。我尝试了以下命令,但是没有用(似乎数字应该从零开始):
ffmpeg -i test_%d.jpg -vcodec mpeg4 test.avi
有什么建议吗?
Answers:
如果-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)
您可以在下面的代码段中使用此代码:
cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4
您可以在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
然后运行:
ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
cp
if链接不起作用的使用,如果您的文件系统支持,cp --reflink=auto
它将获得更好的速度/空间使用率。
ffmpeg还支持bash样式的globbing(*表示任意数量的任何字符)。
如果您的图像是连续的,但不一定像前面的示例中那样按数字顺序排列,则这很有用。
ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4
因此,只要您的文件已排序,使用-pattern_type glob
开关就可以为您工作。
据我所知,您不能以随机数开始序列(我不记得是否应该以0或1开头),此外,它不能有间隔,如果有,ffmpeg会认为序列已结束并且停止添加更多图像。
另外,如对我的答案的评论所述,请记住,您需要指定索引的宽度。喜欢:
图片%03d.jpg
如果使用%03d索引类型,则需要用0填充文件名,例如:
image001.jpg image002.jpg image003.jpg
等等
抬头
x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i"
/tmp/img"$counter".jpg; x=$(($x+1)); done
我知道这是一个古老的问题,但我在Google寻找相同答案时遇到了这个问题。这里没有一个答案能使我完全满意,因此我进行了更多的搜索和阅读,这是我针对自己的问题提出的命令。
cat {0032..1501}*.png | ffmpeg -f image2pipe -framerate 5 -i - -s 720x480 test2.avi
我之所以使用这样的命令的原因是...
-start_number
仅此而已。
我使用了flv编码器,因为我的视频正在使用Flash Player(Jwplayer)
ffmpeg -i%d.jpg -vcodec flv test.flv
就我而言,由于文件中的数字,这有点棘手。这是我的图像的样子:
$ 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
您可以使用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倍。您也可以在其中添加分数以加快速度。
-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张所需的图像效果。
下一步
您还将希望:
剪切一些音频以匹配视频长度:https : //stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpeg
ffmpeg -i in.mp3 -ss 03:10 -to 03:30 -c copy out.mp3
添加剪切的音频:如何在ffmpeg中合并音频和视频文件
ffmpeg -i video.mp4 -i audio.mp3 -c copy output.mkv
TODO:从命令行学习将多个音频文件剪切并连接到视频中:
经过测试
ffmpeg 3.4.4,vlc 3.0.3,Ubuntu 18.04。
参考书目