• FFmpeg将多张图片合成视频
  • 从不同目录下多张图合成视频
    • Pipe
    • Concat
  • 容易误解的几个命令

FFmpeg将多张图片合成视频

首先要计算出视频的总帧数:

总帧数 = duration * fps 。

duration是我们设定的视频的长度,fps是视频每秒的帧数。

第二步将所有的图片文件放到一个临时目录,并且制定一个命名规则(可正则的):
例如图片的素材是image0.jpg image1.jpg image2.jpg

然后可以执行命令合成视频了:

带音频:

ffmpeg -threads2 -y -r 10 -i /tmpdir/image%04d.jpg -i audio.mp3 -absf aac_adtstoasc output.mp4

参数的解释含义:

-threads 2 以两个线程进行运行, 加快处理的速度。

-y 对输出文件进行覆盖

-r 10 fps设置为10帧/秒(不同位置有不同含义,后面再解释)

-i /tmpdir/image%04d.jpg 输入图片文件,图片文件保存为 image0001.jpg image0002.jpg ….

-i audio.mp3 输入的音频文件

-absf aac_adtstoasc 将结果的音频格式转为faac格式时需要这个选项。将音频格式转为faac是因为在iphone上某些音频格式的视频无法播放,例如mp3. 但faac格式的音频的视频在iphone上可以播放。-absf 的意思是设置一个bitstream filter进行某些转换。可以用ffmpeg -bsfs 查看所有支持的bitstream filter。 bitstream filter和 aac_adtstoasc的具体含义我也说不上。但是如果不用这个选项又会导致转换失败。

不带音频

ffmpeg -loop 1 -f image2 -i /tmpdir/image%04d.jpg -vcodec libx264 -r 10 -t 10 test.mp4

-loop 1循环读输入 0读完就不读了
-vcode 编码格式libx264
-b 指定200k码率
-t 输出视频总时长:

这样运行命令就可以生成视频了;

从不同目录下多张图合成视频

上面命令需要从指定文件夹下的特殊命名规则的一组图中去做输入文件;有没有更好的方式呢?比如我有一些图片的存储路径,能不能不拷贝到一个文件夹下再操作,答案是有的。
1. 使用管道Pipe
2. 使用Concat命令

Pipe

You can use cat or other tools to pipe to ffmpeg:
cat读取多张图片输入到一个“全局管道文件”中,然后后面ffmpeg命令从全局管道中(指定-f image2pipe)读取输入文件,生成视频。

cat Desktop/aa/img1.jpg Desktop/aa/img2.jpg Desktop/aa/img3.jpg | ffmpeg -loop 0 -f image2pipe -r 3 -b 200k -s 640*360 -t 12 -i log.pipe -y Desktop/oup.mkv

这个命令在linux、Mac OS、Windows上都是可行的,但是在安卓中不行,可能是ffmpeg找不到那个“全局管道”。
那么我们可以自己创建一个管道,然后告诉ffmpeg管道在哪?

创建管道:

mkfifo Desktop/pic.pipe

向管道输入文件:

cat Desktop/aa/img1.jpg Desktop/aa/img2.jpg > Desktop/pic.pipe

使用ffmpeg读取管道,生成视频:

ffmpeg -loop 0 -f image2pipe -r 3 -b 200k -s 640*360 -t 12 -i Desktop/pic.pipe -y Desktop/oup.mp4

这里pic.pipe的路径子安安卓上要换成安卓的路径:Environment.getExternalStorageDirectory().getAbsolutePath()下面

管道文件非常,非常强大,更多管道知识:

【Linux】mkfifo命令创建命名管道实现进程之间通信
【Linux】进程间通信-命名管道FIFO

Concat

首先,创建个input.txt文件,填写图片信息:

file 文件路径
duration 这张图播放时长

file '/Users/wangshuainan/Desktop/aa/imga.jpg'
duration 5
file '/Users/wangshuainan/Desktop/aa/imgb.jpg'
duration 1
file '/Users/wangshuainan/Desktop/aa/imgc.jpg'
duration 3
file '/Users/wangshuainan/Desktop/aa/imgc.jpg'

注意!!! 最后一个图要重复写一遍,但不用加duration。

然后run ffmpeg command:

ffmpeg -f concat -safe 0 -i Desktop/input.txt -vsync vfr -pix_fmt yuv420p Desktop/output.mp4

这里命令里要加上-safe 0,不然会报unsafe file name的error,不要问我怎么知道的。

参考:

https://trac.ffmpeg.org/wiki/Slideshow

容易误解的几个命令:

下面解释下几个特殊命令的特殊含义:
-t duration
用做输入选项(在-i之前),是限制读取输入文件的的时长;
用做输出选项(before an output url),超过这个时间停止写输出文件;
比如:循环读取一个输入文件时(-loop 1),当到时间就会停止输出,生成一个duration时长的视频。但是如果没有循环选项,而且输入文件短于这个时长时,就会随着输入文件结束就结束,生成视频,视频时长小于duration。所以我们可以看出 -t 并不仅仅是输出文件时长。
当用“管道”时,也不太一样,管道读了之后,里面内容就没了,所以没持续的输入,这个-loop,-t 都是“不起作用的”,除非管道一直有内容。

-t duration (input/output)
When used as an input option (before -i), limit the duration of data read from the input file.When used as an output option (before an output url), stop writing the output after its duration reaches duration.duration must be a time duration specification, see (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual.-to and -t are mutually exclusive and -t has priority.

-r fps
帧率,可以指定两个帧率,输入帧率,输出帧率;
输入帧率:-i之前,设定读入帧率,比如 -r 0.5 ,也就是说1秒要播0.5个图片,那么一个图也就是要播2s;
输出频率:-i之后,真正的输出视频播放帧率,不写话,是默认和输入频率一样。比如设 -r 30 ,对应上面的设定,一个图播2
s,那么输出文件播放时,这2s内,都是这张图,但是播放了60帧。

You can specify two frame rates: input and output.

  • Set input frame rate with the -framerate input option (before -i). The default for reading inputs is -framerate 25 which will be set if no -framerate is specified.
  • The output frame rate for the video stream by setting -r after -i or by using the fps filter. If you want the input and output frame rates to be the same, then just declare an input -framerate and the output will inherit the same value (meaning you can omit the -r).

By using a separate frame rate for the input and output you can control the duration at which each input is displayed and tell ffmpeg the frame rate you want for the output file. This is useful if your player cannot handle a non-standard frame rate. If the input -framerate is lower than the output -r then ffmpeg will duplicate frames to reach your desired output frame rate. If the input -framerate is higher than the output -r then ffmpeg will drop frames to reach your desired output frame rate.

In this example each image will have a duration of 5 seconds (the inverse of 1/5 frames per second). The video stream will have a frame rate of 30 fps by duplicating the frames accordingly:

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

参考:

FFmpeg官网:
http://ffmpeg.org/ffmpeg.html

https://trac.ffmpeg.org/wiki/Slideshow

FFmpeg将多张图片合成视频相关推荐

  1. Android 音视频 --------- FFmpeg将多张图片合成视频

    FFmpeg将多张图片合成视频 首先要计算出视频的总帧数: 总帧数 = duration * fps . duration是我们设定的视频的长度,fps是视频每秒的帧数.第二步将所有的图片文件放到一个 ...

  2. ffmpeg将多张图片合成视频(小模块化)

    一.环境 1.window7 64bit 2.本文中使用的ffmpeg模块为转mp4系列的dll模块,未使用官网中的代码文件.需要参考的可以去下面链接下载. http://download.csdn. ...

  3. 一次使用ffmpeg将多张图片合成视频的经历

    使用的软件: ffmpeg 4.2.1 OS:fedora31 本次历经安装ffmpeg.安装libx264等操作. 正确的命令 ffmpeg -f image2 -r 1 -i img%3d.jpg ...

  4. Ffmpeg 将视频分解成多张图片以及多张图片合成视频

    1.将视频分解成多张图片 -y 覆盖以前的图片 %04d 输出的图片的命名格式 ffmpeg -y -i Desktop/FfmpegVideos/10.avi Desktop/FfmpegImage ...

  5. python图片文字合成视频_利用Python将多张图片合成视频的实现

    今天要做一个量子隧穿的的演示动画,在CSDN上看了很多大佬的文章,然而忙了接近半天才做好这件事.把踩过的坑记一下,同时这段代码也是值得记录的,因为以后也可能遇到类似的工作. 先上代码` import ...

  6. moviepy多张图片合成视频

    moviepy多张图片合成视频 import os import moviepy import moviepy.video.io.ImageSequenceClipdef pics2video(fra ...

  7. 用php把图片合成视频,图片音乐合成视频 多张图片合成视频|图片合成视频软件...

    在网络上我们经常见到的电子相册其本质就是图片音乐合成视频,使用一些图片合成视频软件将多张图片合成视频,外加点炫酷的转场特效,so easy的就能完成了.o(*≧▽≦)ツ 想不想知道具体的操作过程?有兴 ...

  8. 使用ffmpeg拼接两张图片

      最近在工作中遇到了一个需求,就是需要将两张图片拼接在一起,作为一个封面图.如果只是临时拼接一张,我们可以只用photoshop之类的图片编辑工具,将两张图片拼接在一起.而我们的需要是需要实现自动化 ...

  9. ffmpeg.wasm前端实现多张图片合成视频

    ffmpegwasm文档 ffmpeg文档 该功能主要是借助了ffmpeg这个库实现 该项目是由vite+vue3创建的 首先进行ffmpeg安装 yarn add @ffmpeg/ffmpeg @f ...

  10. 使用FFmpeg将一张图片和一段音频转换成视频

    命令 ffmpeg -r 15 -f image2 -loop 1 -i 图片.png -i 音频.mp3 -s 1920x1080 -pix_fmt yuvj420p -t 278 -vcodec ...

最新文章

  1. Spring Boot Profile使用详解及配置源码解析
  2. 高通平台 MIC BIAS 的问题
  3. 小心使用innerHTML
  4. 二叉树表达规定形式的代数表达式并计算表达式结果(无明显缺陷版本)
  5. 将截断字符串或二进制数据
  6. 快手公司厕所装坑位计时器,网友:再也不能带薪拉屎了!
  7. Mysql数据库——sql语句进阶
  8. 嵌入式linux和pc机的linux对照
  9. vue中axios设置表单头_VUE项目axios请求头更改Content-Type操作
  10. MySQL 宣布停止使用 master、slave!
  11. GartnerSynergy:一场IBM云业务营收引发的争议
  12. fataexception matlab,人工势场法路径规划(附MAtlab程序)
  13. 简单嵌入式系统软件架构
  14. 通用权限管理系统项目简单介绍
  15. npm install很慢(奇葩)解决方法
  16. Object Detection(目标检测神文)(二)
  17. win7修改网络计算机名字,Win7系统中不能修改计算机名字是怎么回事?
  18. 静态分析—扇入、扇出、圈复杂度
  19. 华为数字化转型之道 实践篇 第十章 数字化办公:构建全方位的连接与协同
  20. 大数据应用的几个实际案例

热门文章

  1. 关于蚂蚁的纯知识解读:杠杆、资本充足率、ABS
  2. 清华博士生被开除:告诉孩子,不吃学习的苦,就要吃生活的苦
  3. 在Windows Server 2008上用Windows Media Service打造流媒体直播系统
  4. RGB彩色空间和YIQ、灰度等的转化
  5. 计算机大型机小型机的缩写,计算机可被划分为3个基本类型大型机,小型机与微型机。.doc...
  6. UE4 本地化多语言
  7. 获取flickr网站上某个用户的所有图片url
  8. netbeans php下载,Netbeans7下载和安装
  9. NetBeans的下载与安装
  10. 【签约】ManageEngine卓豪签约中国大饭店 | 智能解析日志、洞察威胁,提升数据安全合规性