「馨客栈研究院」FFmpeg系列教程

文章创作时间:2020-07-21

最后更新时间:2020-09-08

相关介绍

官网地址:FFmpeg官网

仓库地址:FFmpeg开源地址

下载地址:FFmpeg官网下载地址

文档地址:FFmpeg官网文档

FFmpeg 是视频处理最常用的开源软件

FFplay是用于播放的应用程序

FFprobe是用于查看文件格式的应用程序

FFmpeg 本身是一个庞大的开源项目,里面包含了许多组件和库文件

本文将主要讲解一下它的命令行工具

命令行参数

-version: 显示版本信息

-h/-?/-help/--help(四个命令显示帮助): 帮助

-c copy:直接复制,不经过重新编码(这样比较快)

-i:指定输入文件

-f:指定输出格式

-ss:开始时间

-preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast(编码速度最快,压缩率低,文件更大), superfast, veryfast, faster, fast, medium, slow, slower, veryslow,placebo(编码速度慢,压缩率高,文件更小)

-y:不经过确认,输出时直接覆盖同名文件

-title string: 设置标题

cls:cmd命令行下可以清空哦

clear:git命令行下可以清空哦

-b:v 548k 设置视频比特率为548Kb/s,默认200k,最好设置与原视频一致

-sws_flags lanczos 分辨率缩放方法使用Lanczos

-qscale 10 -qscale 是视频输出质量,后边的值越小质量越高,但是输出文件就越“肥”

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

-loop 0 无限循环(默认为0,改成1就是播放一次,2就是两次··· ···)

-pix_fmt 设置视频颜色空间(编码像素格式);具体参数可以使用ffmpeg -pix_fmts查看

-qp 恒定量化(0-20);画质最好;视频体积巨大;不推荐使用

-map 指定输出文件的流映射关系 如:-map 1:0 -map 1:1 将第二个输入文件的第一个流和第二个流写入输出文件

视频参数

-b 设定视频流量(指定比特率),与-b:v含义一样,默认为200Kbit/s

-vb 指定视频比特率(bit/s)

-r 设定帧速率(指定帧率),默认为25

-s 设定画面的宽与高(指定分辨率)

-aspect 设定画面的比例,有16:9、4:3、5:4、2:21:1、2:35:1、2:39:1,也可以写1.3333,1.777

-vn 不处理视频(去除视频)

-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器(另一种写法 -c:v)

-vcodec 视频选项,一般后面加copy表示拷贝

-c:v 后面指定视频编码器

-vf 是-filter:v 的缩写,表示给视频添加滤镜

-accurate_seek 剪切精确时间

-lossless 设为导出为无损质量,默认为0

-crf 控制输出质量的,范围0-51,0是无失真编码哈,建议18-28

-crf 会直接影响到输出视频的码率,再设置-b指定码率不会生效的哦

-q:v 2 后面的数字表示输出的质量,一般取1-5之间,1质量最好

-vframes 1 截取一帧,数字越大截取的帧数就越多哦

-profile:v 视频编码器配置

音频参数

-ar 设定采样频率,不指定采样频率会根据输入音视频的采样频率

-ac 表示音频的通道数,1即单声道,2即双声道等

-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器

-an 不处理音频(去除音频)

-ab 指定音频比特率(音频数据流量),与-b:a含义一样,一般选择32,64,96,128(好像不输入默认是128K)

-acodec 后面指定音频编码(另一种写法-c:a)

-acodec 音频选项,一般后面加copy表示拷贝

-af 是-filter:a的缩写

FFmpeg使用语法

ffmpeg ① ② -i ③ ④ ⑤

① 全局参数

② 输入文件参数

③ 输入文件

④ 输出文件参数

⑤ 输出文件

可选视频编码方案

1. MP4封装:H264视频编码+AAC音频编码(最通用)

2. WebM封装: VP8视频编码+Vorbis音频编码(Google为了避开专利开发,无明显优势)

3. OGG封装: Theora视频编码 +Vorvis音频编码(完全开源的编码方式,无专利,HTML5可用)

分辨率

宽屏16:9 480*272 640*360 672*378 720*480 1024*600 1280*720 1920*1080

普屏4:3 320*240 640*480

720x576(SD)

1280x720(HD/hd720)

1920x1080(hd1080/Full-HD)

UHD(3840*2160)

4K(4096*2160)

8K(7680*4320)

01.安装FFmpeg

FFmpeg可以在Windows、Linux还有Mac等多种操作系统中进行安装和使用

局长这里主要讲解windows系统的安装方法

编译好的Windows版本:下载地址

把下载好的文件可以添加到环境变量,方便食用

02.查看视频信息

命令有两个,自己选择

ffmpeg -i input.mp4

ffprobe input.mp4

上面的命令会输出很多多余无用的信息,可以加上【-hide_banner】参数,可以只显示元信息

ffmpeg -i input.mp4 -hide_banner

03.去除音频(提取视频)

input.mp4 是要处理的视频(原视频)

-an 去除原视频的音频流(简单理解就是删掉音频)

-vcodec copy 拷贝原视频的视频数据

ffmpeg -i input.mp4 -vcodec copy -an output.mp4

04.去除视频(提取音频)

如何提取视频里面的音频

-vn表示去掉视频

-c:a copy表示不改变音频编码,直接拷贝

ffmpeg \

-i input.mp4 \

-vn -c:a copy \

output.aac

还可以下面这样,两个命令的含义是一样的

ffmpeg -i test.mp4 -acodec copy -vn output.aac

ffmpeg -i test.mp4 -c:a copy -vn output.aac

05.改变视频分辨率

原视频:720p(1280*720)

改变视频的分辨率,改成(640*360)

如果你知道要修改的视频分辨率,命令可以直接这样写

ffmpeg -i input.mp4 -vf scale=640:360 output.mp4

多行显示,还可以稍微改变一下命令

ffmpeg \

-i input.mp4

-vf scale=640:-1 \

output.mp4

这里要注意一下:改变分辨率,如果宽高比不一样的话,视频可能会被拉伸变形的哦

ffmpeg -i input.mp4 -vf scale=640:-1 output.mp4

使用libx264转码一个视频为mp4格式,如果最后转码的高度不能被2整除

那么很大可能是会报错的哦,主要是一些编码器要求宽度和高度导致的

解决办法: 把-1改成-2就可以了,具体的不深究,知道这样解决就可以了

06.进阶视频分辨率

如果想要将视频(图片)的宽度和高度变成原来的两倍(拉伸视频/图像),可以用下面的两个参数

iw = 输入宽度

ih = 输入高度

视频(图片)变成两倍的命令

​ffmpeg -i input.mp4 -vf scale=iw*2:ih*2 output.mp4

当然上面的例子也可以单独只指定宽度或者高度哦,自行修改上面的命令

如果要将视频(图片)减半,只要乘以0.5或者除以2即可,直接看下面的两个命令

ffmpeg -i input.mp4 -vf "scale=iw*.5:ih*.5" output.mp4

ffmpeg -i input.mp4 -vf "scale=iw/2:ih/2" output.mp4

指定大小并使用正确的宽高比将其缩小

减少 decrease

增加 increase

​ffmpeg -i input.mp4 -vf scale=w=320:h=120:force_original_aspect_ratio=decrease output.mp4

07.隐藏一些无用的信息

查看文件信息:ffmpeg -i input.mp4

上面命令会输出很多冗余信息,加上-hide_banner参数,可以只显示元信息

ffmpeg -i input.mp4 -hide_banner

08.视频添加图片水印

先来一个很简单的

overlay:水印的位置,距离屏幕左侧距离和距离屏幕顶部距离

左上角

ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4

右上角

ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w output.mp4

左下角

ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=0:H-h output.mp4

右下角

ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w:H-h output.mp4

上面的命令解析一下下

大写的 W 表示的是视频的宽度

大写的 H 表示的是视频的高度

小写的 w 表示的是水印图片的宽度

小写的 h 表示的是水印图片的高度

上面的0也是可以修改的

09.去掉视频水印

使用delogo滤镜可以去除视频水印

这样做的缺点:有可能会有马赛克的效果哦

ffmpeg -i input.mp4 -vf delogo=x:y:w:h:show output.mp4

ffmpeg -i input.mp4 -vf delogo=x=*:y=*:w=*:h=*:show=* output.mp4

x,y 这两个是用来确定logo位置的坐标

w,h 这两个是用来设置logo的宽和高的

show表示的是是否显示矩形框,默认是0不显示,1表示是显示

这里举个例子吧!

这里我弄了一个水印的视频,位置在左上角0:0,宽度209,高度52

接下来我们写一下这个命令

ffmpeg -i input.mp4 -vf delogo=1:1:209:52:0 output.mp4

ffmpeg -i input.mp4 -filter_complex delogo=1:1:209:52:0 output.mp4

这里稍微提一下我的理解哈

-vf和-filter_complex有什么区别没有哈,探讨学习

当有多个输入文件的时候,使用 -filter_complex

当只有一个输入文件的时候,就使用 -vf

上面例子都是可以实现相同的功能,大家自行研究摸索探讨咯哦

10.视频添加文字水印

使用drawtext滤镜配合可以获得需要的效果

先来简单说说一些说明

fontfile 后面跟着的是字体文件

text 后面写要显示的文字,记得加''

fontcolor 后面写字体颜色,如red,green,blue

x 显示文字在x轴的坐标

y 显示文字在y轴的坐标

fontsize 显示的是文字的大小,直接后面写数字即可

ffmpeg -i input.mp4 -vf "drawtext=fontsize=36:fontfile=xin.ttf:text='馨客栈-Mackxin':x=10:y=20" output.mp4

ffmpeg -i input.mp4 -vf "drawtext=fontsize=36:fontfile=xin.ttf:text='馨客栈-Mackxin':x=10:y=20:fontcolor=red" output.mp4

11.截取视频

就是截取视频中的某一段并且把它提取出来

解析一下一些参数

-ss 后面跟着时间,从视频的哪个时间点开始截取(写法有00:00:00或者20)

-to 后面也是跟着时间,意思是截取到视频的哪个时间点结束

-t 后面跟着时间,意思是截取多长的时间

注意:这里-to和-t的理解需要注意一下,到时我会稍微深入一点的讲解一下

如:(-ss 10 表示从第10秒开始,-to后面的看我的视频讲解)

ffmpeg -ss 10 -i input.mp4 -to 15 output.mp4

ffmpeg -i inout.mp4 -ss 10 -to 15 output.mp4

注意:如果把-ss放在-i的后面,那么-to就失去作用变成跟-t一样的了哦(截取多长的时间)

现在来讲解一下-t的一些理解

-ss 00:00:15 表示从视频的第15秒开始截取

-t 11 表示截取视频的11秒,从第15秒开始算起

ffmpeg -i input.mp4 -ss 00:00:15 -t 11 output.mp4

ffmpeg -ss 00:00:15 -i input.mp4 -t 11 output.mp4

可以看到上面两个命令的结果是一样的,跟-to还是有区别的,要注意哦

也可以加入下面的参数

-vcodec copy 用原视频的视频编解码器(另一种写法:-c:v copy)

-acodec copy 用原视频的音频编解码器(另一种写法:-c:a copy)

这次的视频内容还是比较多的,努力加油哦

12.视频转换为Gif动图

这次直接上命令

ffmpeg -i input.mp4 -ss 10 -t 5 -s 640x320 -r 15 output.gif

-ss 开始时间

-t 持续时间

-i 后面跟着的是源文件

-s 这里说的是动图的分辨率

-r 帧率(一般后面设置为15,动图就会比较流畅了哈)

再来看一个命令哈

ffmpeg -i input.mp4 -vframes 30 output.gif

-vframes 30 视频的前30帧

整体理解:把视频的前30帧转换成gif动图

稍微看一下转换为高质量的动图,下面就是命令哈

ffmpeg -i input.mp4 -ss 1 -t 20 -vf "fps=15,scale=1920:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=32:reserve_transparent=0[p];[s1][p]paletteuse" -loop 0 output.gif

fps=16 每秒16帧的速率

scale=160:-1 分辨率宽度调整为160,高度自动设置,同时保留宽高比

flags=lanczos 缩放算法为lanczos

-loop 0 无限循环

13.视频压缩之-crf

x264 默认值是 23(建议 18 ~ 28)

x265 默认是是 28(建议 24 ~ 34)

两个的可用值是 0 到 51

值越小编码质量越好,码率越高

其中0可以说是无损的,51可以说是质量最差的

大约crf的值差别为6就会导致文件大小的加倍或减半

ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4

ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4

实验开始

原视频:禽兽超人.mp4(12.0MB),视频码率682kb/s

下面是用libx264,看下结果,依次是15,18,23,28

【21.9MB,1246kb/s】【17.3MB,983kb/s】【12.2MB,692kb/s】【8.54MB,484kb/s】

下面是用libx265,看下结果,依次是15,18,24,28,34

【27.5MB,1560kb/s】【21.2MB,1204kb/s】【12.3MB,699kb/s】【8.43MB,478kb/s】【5.06MB,287kb/s】

14.视频压缩之-preset

-preset 对编码器的预设(指定编码的配置)

preset主要影响编码的速度,并不会很大的影响编码出来文件的大小

x264编码算法有下面的参数值,可以看看

原视频:12.0MB

ultrafast 编码速度最快,压缩率低,生成的文件就很大 35.2MB

superfa 18.5MB

veryfast 11.5MB

faster 11.8MB

fast 12.2MB

medium 12.2MB x264的默认值

slow 12MB

slower 11.9MB

veryslow 11.2MB

placebo 11.4MB 编码速度最慢,压缩率高,生成的我那件就小

这里我会一个一个给大家演示一下这个命令的结果

ffmpeg -i input.mp4 -vocdec libx264 -preset *** -crf 25 output.mp4

15.视频压缩之-crf问答

这里给大家解答一下一个小细节哈

如果你设置了 -crf 参数,那么就不能再设置 -b 参数来设置码率了啊哈

简单总结:-crf 会直接影响到输出视频的码率,再设置 -b 指定码率不会生效的哦

原视频大小:12MB,视频码率:682kb/s

先来一个我们比较正常的命令

ffmpeg -i input.mp4 -vcodec libx264 -crf 28 output.mp4

就比如,下面的命令会出现什么样的结果呢

ffmpeg -i input.mp4 -vcodec libx264 -crf 28 -b:v 500k output.mp4

ffmpeg -i input.mp4 -vcodec libx264 -b:v -crf 28 500k output.mp4

视频结束后,我会把数据公布在这里给大家参考一下哈

直接 -crf 28 后视频的码率是: 484kb/s

加了 -crf 28 -b:v 500k 后视频的码率是: 484kb/s

加了 -b:v 500k -crf 28 后视频的码率是: 484kb/s

16.给视频或图像加上黑边

局长我有一个视频【禽兽超人】分辨率1280*720

先用命令把视频的分辨率改成1080*608

ffmpeg -i input.mp4 -vf scale=1080:-1 output.mp4

现在你有一个1080*608分辨率的视频,要转变成1080*720分辨率

那么就可以加上一个pad命令来实现这个效果,默认加的是黑边哦

ffmpeg -i input.mp4 -vf pad=1080:720:0:56:black output.mp4

pad后面的参数依次是:宽、高、x坐标、y坐标、默认是黑边可以不写

上面的56是这个样得来的(720-608)/2 = 56

再比如:原始是1920*1080,要改为1208*740

ffmpeg -i input.mp4 -vf 'scale=1280:720,pad=1280:720:0:10 output.mp4

先将视频缩小到1280*720,然后再加黑边变成1280*740

这里看不太懂的话,可以多看几遍视频温习一下

赞助馨客栈

xininn

『 馨语 』

人的一生总有得到,放弃,失去的时候。有时候我们是主动得到,放弃的

而有的时候,我们却是被动的。不管是哪种,不失不得是不变的理


人生的路总要向前迈进的。有诸多烦恼与忧愁

只要你勇敢面对,坦然处之,总是会过去的!无论前方有再多的阻碍,也不要停下你的脚步


即使你走的路,不被他人看好和理解;即使你走的路,泥泞不堪

但只要前进的方向是正确的,不必在意他人的看法,自己的路由自己去走


人生最好的状态就是:安于得失,淡于成败,依旧向前

×