一、参考资料

通过ffmpeg把图片转换成视频
FFmpeg命令(一)、使用filter_complex命令拼接视频
FFmpeg 视频处理入门教程给新手的 20 多个 FFmpeg 命令示例
FFmpeg命令行转码
ffmpeg 翻译文档 (ffmpeg-all 包含重要组件)
FFmpeg Filters Documentation
FFmpeg命令行滤镜使用
ffmpeg命令行使用nvidia CUDA scaling高速转分辨率转码(libnpp)
FFmpeg—源码编译
FFmpeg常用命令
Linux上的ffmpeg完全使用指南
视频和视频帧:FFMPEG 硬件解码API介绍

二、安装ffmpeg、ffmpy

安装ffmpeg

# 更新源
sudo apt update# 添加源
sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next # 安装ffmpeg
sudo apt-get install ffmpeg# 查看版本
ffmpeg -version# 查看编码器和解码器
ffmpeg -encoders

安装ffmpy

pip install ffmpy==0.2.2   # 需要权限就添加sudo

三、关键指令

  1. 查看FFmpeg支持的编码器

    ffmpeg configure -encoders
    
  2. 查看FFmpeg支持的解码器

    ffmpeg configure -decoders
    
  3. 查看FFmpeg支持的通信协议

    ffmpeg configure -protocols
    
  4. 查看FFmpeg所支持的音视频编码格式、文件封装格式与流媒体传输协议

    ffmpeg configure --help
    
  5. 播放视频
    FFmpeg命令行工具学习(二):播放媒体文件的工具ffplay

    ffplay input.mp4# 播放完自动退出
    ffplay -autoexit input.mp4
    
  6. 设置视频的屏幕高宽比

    ffmpeg -i input.mp4 -aspect 16:9 output.mp4
    
    通常使用的宽高比是:
    16:9
    4:3
    16:10
    5:4
    2:21:1
    2:35:1
    2:39:1
    
  7. 编码格式转换

    MPEG4编码转成H264编码

    ffmpeg -i input.mp4 -strict -2 -vcodec h264 output.mp4
    

    H264编码转成MPEG4编码

    ffmpeg -i input.mp4 -strict -2 -vcodec mpeg4 output.mp4
    

四、视频压缩

ffmpeg -i 2020.mp4 -vcodec h264 -vf scale=640:-2 -threads 4 2020_conv.mp4ffmpeg -i 1579251906.mp4 -strict -2 -vcodec h264 1579251906_output.mp4

参数解释:

-i 2020.mp4
输入文件,源文件2020_conv.mp4
输出文件,目标文件-vf scale=640:-2
改变视频分辨率,缩放到640px宽,高度的-2是考虑到libx264要求高度是偶数,所以设置成-2,让软件自动计算得出一个接近等比例的偶数高-threads 4
4核运算

其他参数:

-s 1280x720
设置输出文件的分辨率,w*h。-b:v
输出文件的码率,一般500k左右即可,人眼看不到明显的闪烁,这个是与视频大小最直接相关的。-preset
指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
与 veryslow相比,placebo以极高的编码时间为代价,只换取了大概1%的视频质量提升。这是一种收益递减准则:slow 与 medium相比提升了5%~10%;slower 与 slow相比提升了5%;veryslow 与 slower相比提升了3%。
针对特定类型的源内容(比如电影、动画等),还可以使用-tune参数进行特别的优化。-an
去除音频流。-vn
去除视频流。-c:a
指定音频编码器。-c:v
指定视频编码器,libx264,libx265,H.262,H.264,H.265。
libx264:最流行的开源 H.264 编码器。
NVENC:基于 NVIDIA GPU 的 H.264 编码器。
libx265:开源的 HEVC 编码器。
libvpx:谷歌的 VP8 和 VP9 编码器。
libaom:AV1 编码器。-vcodec copy
表示不重新编码,在格式未改变的情况采用。-re
以源文件固有帧率发送数据。-minrate 964K -maxrate 3856K -bufsize 2000K
指定码率最小为964K,最大为3856K,缓冲区大小为 2000K。-y
不经过确认,输出时直接覆盖同名文件。-crf
参数来控制转码,取值范围为 0~51,其中0为无损模式,18~28是一个合理的范围,数值越大,画质越差。

五、视频拼接

  1. 将4个视频拼接成一个很长的视频(无声音)

    ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex '[0:0][1:0] [2:0][3:0] concat=n=4:v=1 [v]' -map '[v]' output.mp4
    
  2. 将4个视频拼接成一个很长的视频(有声音)

    ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex '[0:0][0:1] [1:0][1:1] [2:0][2:1] concat=n=3:v=1:a=1 [v][a]' -map '[v]' -map '[a]’  output.mp4
    

    参数解释:

    [0:0][0:1] [1:0][1:1] [2:0][2:1]
    分别表示第1个输入文件的视频、音频,第2个输入文件的视频、音频,第3个输入文件的视频、音频。concat=n=3:v=1:a=1
    表示有3个输入文件,输出一条视频流和一条音频流。[v][a]
    得到的视频流和音频流的名字,注意在 bash 等 shell 中需要用引号,防止通配符扩展。
    
  3. 横向拼接2个视频

    ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "[0:v]pad=iw*2:ih*1[a];[a][1:v]overlay=w" out.mp4
    

    参数解释:

    pad
    将合成的视频宽高,这里iw代表第1个视频的宽,iw*2代表合成后的视频宽度加倍,ih为第1个视频的高,合成的两个视频最好分辨率一致。overlay
    覆盖,[a][1:v]overlay=w,后面代表是覆盖位置w:0。
    
  4. 竖向拼接2个视频

    ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "[0:v]pad=iw:ih*2[a];[a][1:v]overlay=0:h" out_2.mp4
    
  5. 横向拼接3个视频

    ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -filter_complex "[0:v]pad=iw*3:ih*1[a];[a][1:v]overlay=w[b];[b][2:v]overlay=2.0*w" out_v3.mp4
    
  6. 竖向拼接3个视频

    ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -filter_complex "[0:v]pad=iw:ih*3[a];[a][1:v]overlay=0:h[b];[b][2:v]overlay=0:2.0*h" out_v4.mp4
    
  7. 4个视频2x2方式排列

    ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex "[0:v]pad=iw*2:ih*2[a];[a][1:v]overlay=w[b];[b][2:v]overlay=0:h[c];[c][3:v]overlay=w:h" out.mp4
    

六、视频帧操作

ffmpeg和H264视频的编解码

  1. 查看每帧的信息

    ffprobe -v error -show_frames gemfield.mp4
    

    从pict_type=I可以看出这是个关键帧,然后key_frame=1 表示这是IDR frame,如果key_frame=0表示这是Non-IDR frame。

  2. 截取视频中的某一帧

    把gemfield.mp4视频的第1分05秒的一帧图像截取出来。

    # input seeking
    ffmpeg -ss 00:1:05 -i gemfield.mp4 -frames:v 1 out.jpg
    
    # output seeking
    ffmpeg -i gemfield.mp4 -ss 00:1:05 -frames:v 1 out1.jpg
    

    参数解释:

    -frame:v 1,在video stream上截取1帧。
    input seeking使用的是key frames,所以速度很快;而output seeking是逐帧decode,直到1分05秒,所以速度很慢。
    

    重要说明:

    ffmpeg截取视频帧有2种 seeking 方式,对应有2种 coding 模式:transcoding 和 stream copying(ffmpeg -c copy)。transcoding 模式:需要 decoding + encoding 的模式,即先 decoding 再encoding。stream copying 模式:不需要decoding + encoding的模式,由命令行选项-codec加上参数copy来指定(-c:v copy )。在这种模式下,ffmpeg在video stream上就会忽略 decoding 和 encoding步骤。
    
  3. 查看视频总帧数

    ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 gemfield.mp4
    
  4. 查看 key frame 帧数

    ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 -skip_frame nokey gemfield.mp4
    
  5. 查看 key frame 所在的时间

    ffprobe -v error -skip_frame nokey -select_streams v:0 -show_entries frame=pkt_pts_time -of csv=print_section=0 gemfield.mp4
    
  6. 查看 key frame 分布的情况

    ffprobe -v error -show_frames gemfield.mp4 | grep pict_type
    
  7. 查看 key frame 所在的帧数

    ffprobe -v error -select_streams v -show_frames -show_entries frame=pict_type -of csv gemfield.mp4 | grep -n I | cut -d ':' -f 1
    
  8. 重新设置 key frame interval

    ffmpeg -i gemfield.mp4 -vcodec libx264 -x264-params keyint=1:scenecut=0 -acodec copy out.mp4
    
  9. 查看视频波特率

    ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 gemfield.mp4
    

七、图片与视频

7.1 图片转视频(规则的名称)

ffmpeg -f image2 -i 'in%6d.jpg' -vcodec libx264 -r 25 -b 200k test.mp4

参数解释:

-r 25 表示每秒播放25帧
-b 200k 指定码率为200k图片的文件名为"in000000.jpg",从0开始依次递增。

7.2 图片转视频(不规则的名称)

不规则图片名称转视频。

7.2.1 方法一

不规则图片名称合成视频文件

ffmpeg -framerate 10 -pattern_type glob -i '*.jpg' out.mp4cat *.png | ffmpeg -f image2pipe -i - output.mp4参数解释:
-framerate 10:视频帧率
-pattern_type glob:Glob pattern 模糊匹配
-f image2pipe:图像管道,模糊匹配得到图片名称

7.2.2 方法二

不规则图片名称合成视频文件

  1. 先动手把不规则文件重命名规则图片名。
def getTpyeFile(filelist, type):     res = []     for item in filelist:name, suf = os.path.splitext(item) # 文件名,后缀if suf == type:res.append(item)return respwd = os.getcwd() # 返回当前目录的绝对路径
dirs = os.listdir() # 当前目录下所有的文件名组成的数组
typefiles = getTpyeFile(dirs, '.jpg')for i in range(0,len(typefiles)):os.rename(typefiles[i],"./%d.jpg" % (i)) #将文件以数字规则命令
  1. 将需要合成的图片放在txt中,通过读取txt文件合并成视频。
ffmpeg -f concat -i files.txt output.mp4

7.3 图片格式转换

ffmpeg图片格式转换

webp转换成jpg

ffmpeg -i in.webp out.jpg

webp转换成png

ffmpeg -i in.webp out.png

jpg转换成png

ffmpeg -i in.jpg out.png

jpg转换成webp

ffmpeg -i in.jpg out.webp

png转换成webp

ffmpeg -i in.png out.webp

png转换成jpg

ffmpeg -i in.png out.jpg

八、硬解码与软解码

  1. CPU富余、需要精准控制解码流程、有解码算法的优化、通用性要求高,直接使用软解(也就是CPU解码);
  2. 有其他编解码芯片/模组、CPU不够用,就不得不需要转向硬解码(也就是专用芯片解码)。

FFmpeg教程(超级详细版)相关推荐

  1. CDH6.3.2离线安装教程——超级详细版-附带安装包地址

    CDH6.3.2离线安装教程 CDH6.3.2离线安装教程 1 首先上传离线安装包到主服务器上 1.1相关文件百度云下载地址 2 配置基础环境 2.1 服务器配置 2.2 每台机器安装常用的工具 2. ...

  2. 手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版)

    手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版) SSM(Spring+SpringMVC+Mybatis),目前较为主流的企业级架构方案.标准的MVC设计模式, ...

  3. 本机php环境搭建教程:windows环境下wampserver的配置教程——超级详细

    转载自:http://youchunyan5.blog.163.com/blog/static/5896062020123474456352/ 本机php环境搭建教程:windows环境下wampse ...

  4. Visual Studio 2017,C++MFC免注册调用大漠插件图文教程,详细版

    Visual Studio 2017,C++MFC免注册调用大漠插件图文教程,详细版 前言 提示:这里可以添加本文要记录的大概内容: 有很多人都在问C++MFC怎么免注册调用?其实这些都有参考但是对于 ...

  5. supervisord部署使用超级详细版

    supervisord部署使用超级详细版 一. 安装 pip 命令(安装python 环境) 因为 supervisord本身是基于Python开发的,所以在使用时需要先安装Python 的运行环境 ...

  6. windows安装Weblogic教程(图文教程超详细版)

    windows安装Weblogic教程(超详细) 一. 下载 WebLogic 到Oracle官网http://www.oracle.com/ 下载WebLogic(根据自己的情况选择),本文档下载的 ...

  7. 装机教程:VMWare下安装Linux系统(超级详细版 学不会你打我)

    VMWare下安装Linux系统 在VMWare下创建环境安装centOS 7.0 开发者模式 老弟奥 首先让我们双击打开虚拟机VMware,点击创建新的虚拟机. 在VMWare下创建环境安装cent ...

  8. Colab使用教程(超级详细版)及Colab Pro/Colab Pro+评测

    大家好,我是温柔的玉米

  9. SPSS免费安装教程(详细版)

      前几天,刷到一位博主写了一篇关于SPSS安装的文章,讲的很详细,保姆级别的!!!我把自己安装过程中遇到的问题以及评论区里其他小伙伴遇到的问题进行了总结,希望能帮助到友友们!!!这位博主的文章链接我 ...

  10. 黑客入门(超级详细版)

    据我了解,"黑客"大体上应该分为"正"."邪"两类,正派黑客依靠自己掌握的知识帮助系统管理员找出系统中的漏洞并加以完善,而邪派黑客则是通过各 ...

最新文章

  1. ++项目 cmake头文件路径_CMAKE入门实战
  2. 【怎样写代码】工厂三兄弟之工厂方法模式(一):问题案例
  3. 分区表--SQLServer创建分区表
  4. AJAX初探,XMLHttpRequest介绍
  5. 掌握 需求过程阅读笔记06
  6. Java容器集合类的区别用法
  7. 【Matlab】矩阵中选取任意子矩阵
  8. 首次适应算法_CVPR 2020丨?商汤TSD目标检测算法获得Open Images冠军
  9. 回顾Spirng ioc 控制反转
  10. cocos2dx 简单血量条实现
  11. spring读取properties配置文件_spring简介
  12. 使用Scala编程计算级数
  13. Java项目:药品管理系统(java+SSM+html+jQuery+Tomcat+mysql)
  14. 航空系统c语言课程设计报告,c语言课程设计报告_航空订票系统西安郵電學院.doc...
  15. 打印机服务器不支持1020,HP1020打印机驱动安装不上的解决办法
  16. GE、西门子、PTC、SAP、阿里、腾讯、海尔..工业互联网的『未来战争』
  17. 可汗学院公开课: 统计学 _0 基本数学知识梳理
  18. DTOJ3704 威士忌(whiskey)
  19. Maven五分钟入门
  20. oracle ora00957,常见oracle错误代码ORA-xxxxx及其解决方法(持续更行中)

热门文章

  1. ibase4j使用信息心得
  2. 计算机测试题目及答案6,2017年计算机考试一级上机Word预测试题及答案6
  3. viewStub 延迟布局加载
  4. Hamcrest使用
  5. 商务与经济统计学习 --多个比率的比较、独立性及拟合优度检验
  6. MySQL基础 — 常用命令
  7. java 高效遍历map_精髓!Java中遍历Map集合的五种方式
  8. hyperterminal停止工作_hyper terminal超级终端最新下载
  9. mysql加入时间戳sql语句,SQL插入时间戳问题
  10. 新坑:基于AD9361的手持监测侦察接收机