-pattern_type水珠
这个伟大的选项使它更容易选择图像在许多情况下。
正常速度视频,每帧一张图像,每秒30帧
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
以下是我使用的测试媒体:
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
图片生成:如何使用GLUT/OpenGL渲染到一个文件?
观察视频比ZIP更好地压缩图像序列是一件很酷的事情,因为它能够使用专门的算法压缩跨帧:
opengl-rotating-triangle.mp4: 340 k
opengl-rotating-triangle.zip: 7.3米
将一个音乐文件转换为YouTube上传的固定图像的视频
回复地址:https://superuser.com/questions/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572
每秒播放一张图片的幻灯片视频
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上的两个演示:
https://www.youtube.com/watch?v=grV64VE1U6c
https://www.youtube.com/watch?v=_6D05gCWh_I
做一个嬉皮士,在OGG容器中使用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.ogv
你的图片当然应该按字母顺序排序,通常是:
0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg
等等。
我还会首先确保所有要使用的图像具有相同的纵横比,可能会事先使用imagemagick或nomacs进行裁剪,这样ffmpeg就不必做出艰难的决定。特别地,宽度必须能被2整除,否则转换失败:"width不能被2整除"。
完全真实的幻灯片案例研究设置一步一步
创建幻灯片比运行单个ffmpeg命令要复杂得多,因此这里有一个更有趣的详细示例,受此时间轴的启发。
获取输入媒体:
mkdir -p orig
cd orig
wget -O 1.png https://upload.wikimedia.org/wikipedia/commons/2/22/Australopithecus_afarensis.png
wget -O 2.jpg https://upload.wikimedia.org/wikipedia/commons/6/61/Homo_habilis-2.JPG
wget -O 3.jpg https://upload.wikimedia.org/wikipedia/commons/c/cb/Homo_erectus_new.JPG
wget -O 4.png https://upload.wikimedia.org/wikipedia/commons/1/1f/Homo_heidelbergensis_-_forensic_facial_reconstruction-crop.png
wget -O 5.jpg https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Sabaa_Nissan_Militiaman.jpg/450px-Sabaa_Nissan_Militiaman.jpg
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg
cd ..
# Convert all to PNG for consistency.
# https://unix.stackexchange.com/questions/29869/converting-multiple-image-files-from-jpeg-to-pdf-format
# Hardlink the ones that are already PNG.
mkdir -p png
mogrify -format png -path png orig/*.jpg
ln -P orig/*.png png
现在我们快速查看所有图像大小,以确定最终的纵横比:
identify png/*
输出:
png/1.png PNG 557x495 557x495+0+0 8-bit sRGB 653KB 0.000u 0:00.000
png/2.png PNG 664x800 664x800+0+0 8-bit sRGB 853KB 0.000u 0:00.000
png/3.png PNG 544x680 544x680+0+0 8-bit sRGB 442KB 0.000u 0:00.000
png/4.png PNG 207x238 207x238+0+0 8-bit sRGB 76.8KB 0.000u 0:00.000
png/5.png PNG 450x600 450x600+0+0 8-bit sRGB 627KB 0.000u 0:00.000
所以经典的480p (640x480 == 4/3)长宽比似乎是合适的。
用最小的大小调整进行一次转换,使宽度均匀(TODO
自动为任何宽度,这里我只是手动查看识别输出和减少宽度和高度1):
mkdir -p raw
convert png/1.png -resize 556x494 raw/1.png
ln -P png/2.png png/3.png png/4.png png/5.png raw
ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p raw.mp4
这会产生糟糕的输出,因为从下面的例子可以看出:
ffprobe raw.mp4
Ffmpeg只是获取第一张图像的大小,556x494,然后将所有其他图像转换为相同的大小,打破它们的长宽比。
现在让我们根据ImageMagick自动将图像转换为目标480p纵横比:如何最小限度地将图像裁剪为特定的纵横比?
mkdir -p auto
mogrify -path auto -geometry 640x480^ -gravity center -crop 640x480+0+0 png/*.png
ffmpeg -framerate 1 -pattern_type glob -i 'auto/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p auto.mp4
现在,长宽比很好,但不可避免地要做一些裁剪,把图像中有趣的部分剪掉。
另一种选择是用黑色背景来填充,以获得相同的纵横比,如图所示:调整大小以适合方框,并将“空”部分的背景设置为黑色
mkdir -p black
mogrify -path black -thumbnail 640x480 -background black -gravity center -extent 640x480 png/*.png
ffmpeg -framerate 1 -pattern_type glob -i 'black/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p black.mp4
一般来说,理想情况下,你可以选择具有相同或相似长宽比的图像来避免这些问题。
关于CLI选项
但是请注意,尽管有这个名字,-glob这并不像shell Glob模式那样通用,例如:-i '*'失败:https://trac.ffmpeg.org/ticket/3620(显然是因为文件类型是从扩展名推断出来的)。
-r 30使-帧率1视频30帧/秒,以克服像VLC这样的低帧率播放器中的错误:VLC冻结低1帧/秒的视频,从ffmpeg图像创建。因此,它重复每帧30次,以保持所需的1帧/秒效果。
下一个步骤
你还需要:
使用ffmpeg根据开始和结束时间来切割视频
Ffmpeg -i in.mp3 -ss 03:10 -to 03:30 -c copy out.mp3
或者,你也可以在转换命令中直接剪切它,在音频-i之前添加-ss:
Ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -ss 0:36 -i orig/音频。Ogg -c:v libx264 -c:一个副本-最短-r 30 -pix_fmt yuv420p raw.mp4
要做的:学会在没有中间文件的情况下将多个音频文件剪切并连接到视频中,我非常确定这是可能的:
Ffmpeg剪切和连接单命令行
https://video.stackexchange.com/questions/21315/concatenating-split-media-files-using-concat-protocol
https://superuser.com/questions/587511/concatenate-multiple-wav-files-using-single-command-without-extra-file
每个图像的持续时间不同
https://video.stackexchange.com/questions/23530/use-ffmpeg-to-create-a-video-from-a-few-images给出了一个解决方案。
创建一个。txt格式的文件,如下所示:
file png/1.png
outpoint 5
file png/2.png
outpoint 2
file png/3.png
outpoint 7
outpoint以秒为单位设置前一个图像的持续时间。
然后我们从前面的转换命令中删除-framerate:
ffmpeg -f concat -i in.txt -framerate 1 -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p black.mp4
我还喜欢在文件中使用文件名的方法,这种方法比必须重命名输入文件以使其具有正确的顺序要好,这使得在文本编辑器中更容易快速地重新排序图像(多个-i不起作用)。每个输入文件有两行,这有点烦人,我没有设法将文件和outpoint合并成一行,但仍然很高兴知道。
如果您只是要转换图像的一个子集,这种方法也很方便。然后,为了节省ImageMagick的时间,你可以重用这个in.txt文件,只循环你关心的图像:
grep -E '^file ' in.txt | sed -E 's/^file //; s/\..*//' | while read f; do
echo $f
convert -thumbnail 1280x720 -background black -gravity center -extent 1280x720 "$(command ls -1 ../$f.* | grep -v .xcf | head -n1)" "out/$f.jpg"
done
测试
ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04。
参考书目
http://trac.ffmpeg.org/wiki/Slideshow官方维基