如何使用 FFmpeg 从图像创建视频? [关闭]

2024-04-04

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

-pattern_type glob

在许多情况下,这个很棒的选项可以更轻松地选择图像。

正常速度视频,每帧一张图像,帧速率为 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 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

Result: https://www.youtube.com/watch?v=HG7c7lldhM4 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渲染到文件? 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

将一个音乐文件转换为具有固定图像的视频以供 YouTube 上传

回答于:https://superuser.com/questions/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572 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=grV64VE1U6c
  • https://www.youtube.com/watch?v=_6D05gCWh_I https://www.youtube.com/watch?v=_6D05gCWh_I

做一个嬉皮士并使用OGG 容器中的 Theora 不受专利限制的视频格式 https://video.stackexchange.com/questions/14694/mp4-h-264-patent-issues:

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 or nomacs https://unix.stackexchange.com/questions/25978/image-viewer-for-multiple-images/539333#539333事先,这样 ffmpeg 就不必做出艰难的决定。特别是,宽度必须能被 2 整除,否则转换失败并显示:“宽度不能被 2 整除”。

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

创建幻灯片比运行单个 ffmpeg 命令要复杂一些,所以这里有一个更有趣的详细示例受到这个时间线的启发 https://en.wikipedia.org/wiki/Human_evolution#History_of_study.

获取输入媒体:

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 自动化任何宽度,这里我只是手动查看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

这会产生糟糕的输出,因为从以下内容可以看出:

ffprobe raw.mp4

ffmpeg 仅采用第一个图像的大小 556x494,然后将所有其他图像转换为该精确大小,从而打破了它们的宽高比。

现在让我们通过裁剪将图像自动转换为目标 480p 宽高比ImageMagick:如何将图像最小化到特定的宽高比? https://stackoverflow.com/questions/21262466/imagemagick-how-to-minimally-crop-an-image-to-a-certain-aspect-ratio

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

所以现在,纵横比很好,但不可避免地需要进行一些裁剪,即剪切图像中有趣的部分。

另一种选择是用黑色背景填充以具有相同的纵横比,如下所示:调整大小以适合盒子,并将“空”部分的背景设置为黑色 https://stackoverflow.com/questions/18514083/resize-to-fit-in-a-box-and-set-background-to-black-on-empty-part/18514327

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 '*' fails: https://trac.ffmpeg.org/ticket/3620 https://trac.ffmpeg.org/ticket/3620(显然是因为文件类型是从扩展名推导出来的)。

-r 30使得-framerate 1视频 30 FPS,以克服 VLC 等播放器中低帧率的错误:使用 ffmpeg 从图像创建的低 1 FPS 视频时 VLC 冻结 https://stackoverflow.com/questions/19267443/playback-issues-in-vlc-with-low-fps-video-from-images-using-ffmpeg/41797724#41797724因此,它会重复每帧 30 次,以保持所需的每秒 1 个图像的效果。

下一步

您还需要:

  • 在加入之前剪切您想要的音频部分:使用ffmpeg根据开始和结束时间切割视频 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
    

    或者,您也可以直接在转换命令中添加-ss就在音频之前-i:

    ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -ss 0:36 -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p raw.mp4
    

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

  • ffmpeg 剪切和连接单个命令行 https://stackoverflow.com/questions/42250223/ffmpeg-cut-and-concat-single-command-line
  • https://video.stackexchange.com/questions/21315/concatenating-split-media-files-using-concat-protocol 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://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 https://video.stackexchange.com/questions/23530/use-ffmpeg-to-create-a-video-from-a-few-images给出了一个解决方案。

你创建一个文件in.txt like:

file png/1.png
outpoint 5
file png/2.png
outpoint 2
file png/3.png
outpoint 7

and 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不工作)。每个输入文件有两行使得这有点烦人,我没有设法将file and 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 http://trac.ffmpeg.org/wiki/Slideshow官方维基
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 FFmpeg 从图像创建视频? [关闭] 的相关文章

  • 使用 ffmpeg 提取帧的最快方法?

    您好 我需要使用 ffmpeg 从视频中提取帧 有没有比这更快的方法 ffmpeg i file mpg r 1 1 filename 03d jpg 如果 JPEG 编码步骤对性能要求太高 您可以始终将未压缩的帧存储为 BMP 图像 ff
  • 图像上的 JQuery 加载事件

    我想在加载图像时将图像父级的大小调整为与图像相同的大小 此时我正在使用这段代码 window load function image principale each function this parent css height this
  • CSS - 将文本保留在图像下方

    我正在尝试创建一个简单的图片库 有人告诉我使用 float left 但是当我这样做时 页脚中的所有文本都会射到第一张图像 我已经搜索了大约一个小时试图找到解决方案 但我找不到任何东西 我尝试过使用边距 边框 不同的对齐方式和各种不同的小东
  • Nodejs Base64 中的读取文件

    我正在尝试从客户端读取以 base64 编码的图像 如何使用nodejs进行阅读 My code add to buffer base64 image var encondedImage new Buffer image name base
  • 同时重新排序和旋转图像的高效方法

    为了快速加载 jpeg 我为turbojpeg 实现了一个 mex wrapper 以有效地将 大 jpeg 读入 MATLAB 对于 4000x3000px 的图像 实际解码只需要大约 120 毫秒 而不是 5 毫秒 然而 像素顺序是 R
  • java.sql.SQLException:在结果集开始之前[重复]

    这个问题在这里已经有答案了 我已尝试使用以下代码来检索存储在数据库中的图像 我创建了一个名为image db包含一个名为的表image details 该表有两个字段 id and image path两者都是类型mediumblob 我在
  • CSS 比例和方形中心裁剪图像

    所以我的应用程序中有一个缩略图集合 其大小为200x200 有时原始图像没有这个比例 所以我计划将此图像裁剪为正方形 目前它只是拉伸图像以适合缩略图 所以说我的原始图像大小是400x800 那么图像看起来就很压扁 我想裁剪此图像 以便它查看
  • 如何修复此 YCrCb -> RBG 转换公式?

    我使用的公式来自这个问题 https stackoverflow com questions 8838481 kcvpixelformattype 420ypcbcr8biplanarfullrange frame to uiimage c
  • 从项目文件加载图像

    我正在尝试获取 png 图像 这是我的资源文件夹 我测试了这里写的解决方案 将图像添加到列表框 c Windows Phone 7 https stackoverflow com questions 9348766 add images t
  • 图像未显示在从 HTML 创建的 PDF 上

    我想动态创建 PDF 这意味着我将从 Google Drive 获取文件 然后将它们放入 HTML 代码中 并尝试从中创建 PDF 一切工作正常 除了图像没有显示 我现在正在做的是 从 HTML 字符串创建 HtmlOutput 获取该 H
  • 使用 SSL 的 Xamarin.Forms Image.Source

    我正在使用一个在线商店来存储通过我们的应用程序上传的用户图像 并受 SSL 保护 上传工作一切顺利 因为我使用的是带有附加证书的 WebClient 但是当我尝试使用 Xamarin Forms Image 组件时 例如将源设置为 http
  • Tkinter:无法识别图像文件中的数据[重复]

    这个问题在这里已经有答案了 我有以下问题 我使用外部应用程序生成 GIF 文件 对我来说 GIF 看起来不错 我可以毫无问题地打开它们 然而 使用 photo PhotoImage file screenshot file self pre
  • Android:自动从项目包中删除未使用的图像

    我正在开发一个相当大的android项目 并且在drawable文件夹中有很多图像 其中许多图像未在项目中使用 因为它们已被替换 并且占用了宝贵的空间 有什么方法可以自动找到这些图像并删除它们 而不是搜索项目中的每个图像 我使用过的一些工具
  • 如何从 Linux 命令行获取视频文件的分辨率(宽度和高度)?

    我一直在挖掘 mplayer mencoder 和 ffmpeg 文档 但我似乎无法想出anything 我对输出格式不是特别挑剔 因为我可以使用正则表达式将其拉出来 我只是似乎无法首先获取数据 Use ffprobe https ffmp
  • 使用 Ffmpeg 编辑视频元数据

    我想更改视频元数据 原始视频信息 ffmpeg i video mp4 Metadata major brand mp42 minor version 0 compatible brands isomavc1mp42 creation ti
  • 如何在java中通过socket发送Image数据类型

    我真的很困惑如何通过套接字发送图像数据类型 请帮我 我已经搜索了如何将 Image 数据类型转换为 char 但结果是 0 Use ImageIO http docs oracle com javase 1 4 2 docs api jav
  • 在TImageViewer中,如何获取用户点击图片的位置?

    在TImageViewer控件中 用户可以缩放或平移图片 我的问题是 当用户点击图片时 如何获取用户在图片上的点击位置 尤其是用户可以对图片进行放大 缩小或平移之后 如何获取对应的图片点击位置呢 As shown below How to
  • 在单个显示器中绘制多个 jpeg 图像

    我需要在单个组合显示器 或画布 中绘制和显示多个 jpeg 图像 例如 假设我有图像 a b c d jpg 每个图像的大小不同 我想将它们绘制在 2x2 网格的一页上 能够为每个子图设置标题也很好 我一直在彻底寻找解决方案 但不知道如何去
  • 如何使网页中出现的图标闪烁/闪烁

    几天前我开始研究高级java 我知道太晚了 我被困在使图标 出现在任务栏上 闪烁的特定任务上 这种闪烁应该根据特定条件发生 这意味着可以使用以下方法来实现javascript 我已经搜索了一段时间了 但是有没有办法让图标每隔 1 秒左右出现
  • OpenCV IP 相机应用程序崩溃 [h264 @ 0xxxxx] 访问单元中缺少图片

    我在 cpp 中有一个 opencv 应用程序 它使用 opencv 的简单结构捕获视频流并将其保存到视频文件中 它与我的网络摄像头完美配合 但是 当我运行它从 IP 摄像机捕获流时 它可能会在大约十秒后崩溃 我的编译命令是 g O3 IP

随机推荐