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

Image 如何使用FFmpeg从图像创建视频?,image,ffmpeg,slideshow,Image,Ffmpeg,Slideshow,这行代码运行良好,但我想从另一个文件夹中的图像创建一个视频文件。 “我的文件夹”中的图像名称为: ffmpeg -r 1/5 -start_number 2 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4 如何从其他文件夹输入图像文件?示例:C:\mypics 我尝试了这个命令,但是ffmpeg只生成了第一个图像(img001.jpg)的视频 见 如果视频未正确显示帧如果遇到问题,例如跳过第一幅图像或仅显示一帧,则使用fps

这行代码运行良好,但我想从另一个文件夹中的图像创建一个视频文件。 “我的文件夹”中的图像名称为:

ffmpeg -r 1/5 -start_number 2 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
如何从其他文件夹输入图像文件?示例:
C:\mypics

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

如果视频未正确显示帧如果遇到问题,例如跳过第一幅图像或仅显示一帧,则使用fps视频过滤器而不是-r作为输出帧率

或者,可以将格式视频过滤器添加到过滤器链中,以替换-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
下面的参数也起作用,但它总是跳过第一张图像

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
从放置在不同文件夹中的图像制作视频

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

"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
样本用法如下

# 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'
-safe 0参数可防止不安全的文件名错误

相关链接


-图案(U型球)

在许多情况下,这个很棒的选项使选择图像变得更容易

每秒播放一张图像的幻灯片视频

"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"
向其中添加一些音乐,当图像结束时,可能较长的音频将被切断:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
  -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
等等

我还将首先确保要使用的所有图像具有相同的纵横比,可能是使用
imagemagick
或事先对其进行裁剪,这样ffmpeg就不必做出艰难的决定。特别是,宽度必须能被2整除,否则转换将失败:“宽度不能被2整除”

正常速度视频,每帧30帧一幅图像

0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg
下面是它的样子:

GIF生成时使用:

添加一些音频:

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -c:v libx264 -pix_fmt yuv420p out.mp4
结果:

这些是我使用过的测试介质:a

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -i audio.ogg -c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out.mp4
通过以下方式生成的图像:

观察视频比ZIP更好地压缩图像序列的程度很酷,因为它能够使用专门的算法跨帧压缩:

  • opengl旋转三角形.mp4
    :340K
  • opengl旋转三角形.zip
    :7.3M
将一个音乐文件转换为带有固定图像的视频,以便上传YouTube

"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"
答复如下:

完整真实幻灯片案例研究逐步设置

与运行单个ffmpeg命令相比,创建幻灯片要多得多,因此这里有一个更有趣的详细示例

获取输入媒体:

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
现在,我们可以快速查看所有图像大小,以确定最终的纵横比:

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/*
因此,经典的480p(640x480==4/3)纵横比似乎是合适的

以最小的大小进行一次转换,使宽度均匀(TODO 自动调整任何宽度,这里我只是手动查看了
identify
输出,并将宽度和高度减少了一倍):

这会产生糟糕的输出,因为从以下方面看:

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
ffmpeg仅获取第一幅图像的大小556x494,然后将所有其他图像转换为该精确大小,从而打破它们的纵横比

现在,让我们通过按照以下步骤进行裁剪,将图像自动转换为目标480p纵横比

所以现在,宽高比很好,但不可避免地要做一些裁剪,这是一种切割图像有趣部分的方法

另一个选项是用黑色背景填充,使其具有与下图所示相同的纵横比:

但一般来说,您最好能够选择具有相同或相似纵横比的图像,以避免出现这些问题

关于CLI选项

但是请注意,尽管名称为,
-glob
,但这并不像shell glob模式那样通用,例如:
-i'*'
失败:(显然是因为文件类型是从扩展推导出来的)

-r 30
使
-framerate 1
视频以每秒30帧的速度播放,以克服像VLC这样的低帧率播放器中的缺陷:因此,它将每帧重复30次,以保持每秒1幅图像的效果

下一步

您还需要:

  • 在加入音频之前,请先剪切所需的音频部分:

TODO:学习在没有中间文件的情况下将多个音频文件剪切并连接到视频中,我很确定这是可能的:

在上测试

ffmpeg 3.4.4、vlc 3.0.3、Ubuntu 18.04

参考书目

  • 官方维基
来自的简单版本 特别适合于图像:


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


从视频创建帧:

ffmpeg -framerate 24 -i Project%03d.png Project.mp4
可选:删除输出视频中不需要的帧
(比使用
-ss
-t
剪裁视频更准确)

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

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

“如果遇到问题,例如跳过第一幅图像或仅显示一帧,则使用​fps视频过滤器“对不起,请您准确解释一下“fps视频过滤器”的含义好吗?据我所知–r参数是可变帧速率这意味着FFMPEG可能会丢弃或复制帧以达到所需的输出帧速率。美国
ffprobe raw.mp4
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
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
ffmpeg -i in.mp3 -ss 03:10 -to 03:30 -c copy out.mp3
ffmpeg -framerate 24 -i Project%03d.png Project.mp4
ffmpeg\ffmpeg -i %video% test\thumb%04d.jpg -hide_banner
ffmpeg\ffmpeg -framerate 30 -start_number 56 -i test\thumb%04d.jpg -vf format=yuv420p test/output.mp4