ffmpeg -r 1/5 -start_number 2 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

这一行工作得很好,但我想从另一个文件夹中的图像创建一个视频文件。 我文件夹中的图像名称是:

img001.jpg
img002.jpg
img003.jpg
...

我如何从不同的文件夹输入图像文件?例如:C: \ mypics

我尝试了这个命令,但ffmpeg只生成了第一个图像(img001.jpg)的视频。

ffmpeg -r 1/5 -start_number 0 -i C:\myimages\img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

参见从图像创建视频幻灯片- FFmpeg

如果你遇到问题,比如第一张图像被跳过或只显示一帧,那么使用fps视频过滤器而不是-r输出帧率

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4

或者,格式视频过滤器可以添加到过滤器链中,以取代-pix_fmt yuv420p,如“fps=25,format=yuv420p”。这种方法的优点是可以控制先使用哪个筛选器

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" out.mp4

我测试了下面的参数,它为我工作

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -vf "fps=25,format=yuv420p" e:\out.mp4

下面的参数也工作,但它总是跳过第一个图像

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -r 30 -pix_fmt yuv420p e:\out.mp4

从放置在不同文件夹中的图像制作视频

首先,将图像路径添加到imagepath .txt,如下所示。

# this is a comment details https://trac.ffmpeg.org/wiki/Concatenate

file 'E:\images\png\images__%3d.jpg'
file 'E:\images\jpg\images__%3d.jpg'

示例用法如下;

"h:\ffmpeg\ffmpeg.exe" -y -r 1/5 -f concat -safe 0 -i "E:\images\imagepaths.txt" -c:v libx264 -vf "fps=25,format=yuv420p" "e:\out.mp4"

-safe 0参数防止不安全的文件名错误

相关链接

FFmpeg从放置在不同文件夹中的图像制作视频

FFMPEG中间指南/图像序列

Concatenate - FFmpeg

-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官方维基

文档中的简单版本

作品特别伟大的谷歌地球工作室图像:

ffmpeg -framerate 24 -i Project%03d.png Project.mp4

Cat *.png | ffmpeg -f image2pipe -i - output.mp4

从维基

从视频中创建帧:

ffmpeg\ffmpeg -i %video% test\thumb%04d.jpg -hide_banner

可选:删除帧你不想在输出视频 (比使用-ss & -t修剪视频更准确)

然后从图像/帧创建视频,例如:

ffmpeg\ffmpeg -framerate 30 -start_number 56 -i test\thumb%04d.jpg -vf format=yuv420p test/output.mp4

您的文件应该命名为depth_00001.png depth_00002.png等,以确保正确的顺序

如果它们被称为depth_1.png depth_2.png,那么您可以用这个命令批量重命名它们为所需的命名

for f in depth_[0-9]*; do mv "$f" "$(printf 'depth_%05d' "${f#depth_}" 2> /dev/null)"; done; for f in depth_[0-9]*; do mv "$f" "$f.png"; done;

步骤2)然后使用标准选项运行ffmpeg

ffmpeg -framerate 30 -i depth_%05d.png -pix_fmt yuv420p -c:v libx264 depth.mp4

步骤3)如果失败了(我在Windows上就是这样),那就试试这个

cat depth_*.png | ffmpeg -f image2pipe -framerate 30 -i - -pix_fmt yuv420p -c:v libx264 depth.mp4

注意:当我使用png时,步骤2失败了-但当我使用图像魔法将png转换为jpg时,步骤2工作了

下面是我用来进行转换的命令

for image in *.png; do magick convert "$image" "${image%.*}.jpg"; done;

此外,我发现这个命令在验证输出视频的长度是否符合预期方面很有用

ffprobe -v quiet -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 depth.mp4

为我创建视频与音频它工作,你需要指定:

正常帧:-framerate 30

audio -i audio/audio.ogg

以及libx264库

   system("ffmpeg -framerate 30 -i #{out_dir}/%03d.png -i audio/audio.ogg 
-c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out/final
/#{out_dir.sub("out/", "")}.mp4")

如果你想创建一个循环,例如3乘以-stream_loop 2,因为0,1,2

    system("ffmpeg -stream_loop 2 -framerate 30 -i 
#{out_dir}/%03d.png -i audio/audio.ogg -c:a copy -shortest -c:v 
libx264 -pix_fmt yuv420p -b:v 50M  out/final/#{out_dir.sub("out/", 
"")}.mp4")

我发现这很有用,并尝试了一下

Ffmpeg -framerate 1 -pattern_type glob -i '*.jpg' -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4

来源:https://shotstack.io/learn/use-ffmpeg-to-convert-images-to-video/

由于glob命令在windows上不可用,因为它是POSIX实现,所以解决方法是使用序列作为模式。要做到这一点,人们需要用序列号重命名他们的文件

gym01.jpg
gym02.jpg
...

然后我们可以在Windows上使用下面的命令-注意gym%02d.jpg,其中如果您的序列包含超过2个字符(例如,gym00001.jpg),则相应地更改它(gym%05d.jpg)

ffmpeg -framerate 1 -pattern_type sequence -i gym%02d.jpg -s:v 1920x1080 -c:v libx264 -pix_fmt yuv420p out.mp4