一、安装

1、若没有安装brew指令,打开终端,安装homebrew

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 

敲击完毕后输入 1
若无法成功,可再次输入命令重试
安装成功后重新启动

2、安装ffmpeg,打开终端输入

brew install ffmpeg

若报错Command failed with exit 128:git的话,输入brew -v后会提示你执行两个配置命令,直接复制执行就ok了!

git config --global --add safe.directory /opt/homebrew/Library/Taps/homebrew/homebrew-cask Homebrew/homebrew-cask

git config --global --add safe.directory /opt/homebrew/Library/Taps/homebrew/homebrew-core Homebrew/homebrew-core

3、若没有报错,输入指令查看是否安装成功

ffmpeg -version

二、ffmpeg参数

常用参数

-c:      指定编码器
-c copy: 直接复制,不经过重新编码(这样比较快)  eg: ffmpeg -i input.mp4 -c copy output.webm 
          将视频从一种容器转到另一个容器
-f:      强制设定文件格式,需使用能力集列表中的名称(缺省是根据扩展名选择的)
-c:v:    指定视频编码器  	eg:  ffmpeg -i [input.file] -c:v libx265 output.mp4  转成 H.265 
          编码
-c:a:    指定音频编码器  
-i:      指定输入文件  		eg: ffmpeg -i input.mp4 查看文件信息
-an:     去除音频流
-vn:     去除视频流   eg: $ ffmpeg -i input.mp4 -vn -c:a copy output.aac 从视频中提取音频;- 
          vn去掉视频,-c:a copy表示不改变音频编码,直接拷贝。
-preset: 指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, 
          veryfast, faster, fast, medium, slow, slower, veryslow。
-y:      不经过确认,输出时直接覆盖同名文件。
-vf scale=480*360   改变分辨率  eg:ffmpeg -i input.mp4 -vf scale=320*240 output.mp4
-s        设置视频分辨率 		eg:ffmpeg -i input,mp4 -s 320x240 output.mp4
-vframes 1 指定只截取一帧  
-q:v      2表示输出的图片质量,一般为1到5(1代表质量最高)
-ss       开始时间
-t        持续时间
-to       结束时间
-loop 1   表示图片无限循环
-shortest 音频文件结束,输出视频就结束
-r fps    设置帧率 		eg: ffmpeg -i input.mp4 -r 24 output.mp4 设置帧率为24
-b        设置码率 		eg: ffmpeg -i input.avi -b 1.5M output.mp4
-b:a      音频 -b:v 视频
-fs       (file size首字母缩写)控制输出文件大小 eg: ffmpeg -i input.avi -fs 1024K output.mp4
-ar        指定音频采样率 比如48000
-channels  指定音频通道数 比如双通道为2
-profile:a 指定音频编码格式 比如AAC_LC
-ss        开始时间

视频参数

-b 设定视频流量(码率),默认为200Kbit/s 
-r 设定帧速率,默认为25 
-s 设定画面的宽与高 
-aspect 设定画面的比例 
-vn 不处理视频 
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器 
-g gop_size 设置图像组大小 这里设置GOP大小,也表示两个I帧之间的间隔

音频参数

-ar 设定采样率 
-ac 设定声音的Channel数 
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器 
-an 不处理音频

能力集列表

-formats:列出支持的文件格式。

-codecs:列出支持的编解码器。

-decoders:列出支持的解码器。

-encoders:列出支持的编码器。

-protocols:列出支持的协议。

-bsfs:列出支持的比特流过滤器。

-filters:列出支持的滤镜。

-pix_fmts:列出支持的图像采样格式。

-sample_fmts:列出支持的声音采样格式。

三、ffmpeg用例

1、视频格式转换

ffmpeg -i input.avi output.mp4
ffmpeg -i input.mp4 output.ts

2.提取音频

ffmpeg -i 晓松奇谈.mp4 -acodec aac -vn output.aac
# (-vn 不处理视频 )

3.提取视频

ffmpeg -i input.mp4 -vcodec copy -an output.mp4
# -an 不处理音频

4.视频剪切

# 下面的命令,就可以从时间为00:00:15开始,截取5秒钟的视频。
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
# -ss表示开始切割的时间,-t表示要切多少。上面就是从开始,切5秒钟出来。

5.码率控制(文件可变小)
码率控制对于在线视频比较重要。因为在线视频需要考虑其能提供的带宽。

那么,什么是码率?很简单: bitrate = file size / duration

比如一个文件20.8M,时长1分钟,那么,码率就是:
biterate = 20.8M bit/60s = 20.810241024*8 bit/60s= 2831Kbps
一般音频的码率只有固定几种,比如是128Kbps, 那么,video的就是
video biterate = 2831Kbps -128Kbps = 2703Kbps。

说完背景了。好了,来说ffmpeg如何控制码率。 ffmpg控制码率有3种选择,-minrate -b:v -maxrate

# -b:v主要是控制平均码率。 比如一个视频源的码率太高了,有10Mbps,文件太大,想把文件弄小一点,但是又不破坏分辨率。 
ffmpeg -i input.mp4 -b:v 2000k output.mp4
# 上面把码率从原码率转成2Mbps码率,这样其实也间接让文件变小了。目测接近一半。
# 不过,ffmpeg官方wiki比较建议,设置b:v时,同时加上 -bufsize
# -bufsize 用于设置码率控制缓冲器的大小,设置的好处是,让整体的码率更趋近于希望的值,减少波动。
#(简单来说,比如1 2的平均值是1.5, 1.49 1.51 也是1.5, 当然是第二种比较好) 
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4
# -minrate -maxrate就简单了,在线视频有时候,希望码率波动,不要超过一个阈值,可以设置maxrate。
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4

6.视频编码格式转换
比如一个视频的编码是MPEG4,想用H264编码,咋办?

ffmpeg -i input.mp4 -vcodec h264 output.mp4
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4

7.将输入的1920x1080缩小到960x540输出

ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
# ps: 如果540不写,写成-1,即scale=960:-1, 那也是可以的,ffmpeg会通知缩放滤镜在输出时保持原始的宽高比。

8.为视频添加logo / 水印

左上角:ffmpeg -i output.mp4 -i pptv.png -filter_complex overlay output3.mp4
右上角:ffmpeg -i output.mp4 -i pptv.png -filter_complex overlay=W-w output4.mp4
左下角:ffmpeg -i output.mp4 -i pptv.png -filter_complex overlay=0:H-h output5.mp4
右下角:ffmpeg -i output.mp4 -i pptv.png -filter_complex overlay=W-w:H-h output6.mp4

9.为视频去除 logo / 水印

# ffmpeg -i 原始视频文件 -vf delogo=x:y:w:h 处理后视频文件,x,y为距左上角坐标,w,h为水印的宽度和高度
ffmpeg -i origin.mp4 -vf delogo=1000:32:260:86 output.mp4

10.抓取视频的一些帧,存为jpeg图片

ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
 
-r 表示每一秒几帧
-q:v表示存储jpeg的图像质量,一般2是高质量。

如此,ffmpeg会把input.mp4,每隔一秒,存一张图片下来。假设有60s,那会有60张。60张?什么?这么多?不要不要。。。。。不要咋办?? 可以设置开始的时间,和你想要截取的时间呀

ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
 
-ss 表示开始时间
-t表示共要多少时间。

如此,ffmpeg会从input.mp4的第20s时间开始,往下10s,即20~30s这10秒钟之间,每隔1s就抓一帧,总共会抓10帧。

# 从一个视频文件中抽取一帧图像:
ffmpeg -y -i test.mp4 -ss 00:03:22.000 -vframes 1 -an test.jpg

11.将图片序列合成视频 | 将视频分解成图片序列

ffmpeg -f image2 -i image%d.jpg video.mpg

上面的命令会把当前目录下的图片(名字如:image1.jpg. image2.jpg. 等…)合并成video.mpg

ffmpeg -i video.mpg image%d.jpg

上面的命令会生成image1.jpg. image2.jpg. …

支持的图片格式有:PGM. PPM. PAM. PGMYUV. JPEG. GIF. PNG. TIFF. SGI

12.视频压缩:H264编码profile & level控制

ffmpeg -i input.mp4 -profile:v baseline -level 3.0 output.mp4
ffmpeg -i input.mp4 -profile:v main -level 4.2 output.mp4
ffmpeg -i input.mp4 -profile:v high -level 5.1 output.mp4

如果ffmpeg编译时加了external的libx264,那就这么写:
ffmpeg -i input.mp4 -c:v libx264 -x264-params “profile=high:level=3.0” output.mp4
从压缩比例来说,baseline< main < high,对于带宽比较局限的在线视频,可能会选择high,但有些时候,做个小视频,希望所有的设备基本都能解码(有些低端设备或早期的设备只能解码baseline),那就牺牲文件大小吧,用baseline。自己取舍吧!

13. 旋转视频

在手机上录的视频,在电脑放,是颠倒的,需要旋转90度。使用格式工厂失败了
使用ffmpeg -i 3.mp4 -vf rotate=PI/2 rotate8.mp4画面确实旋转过来了
但是尺寸不对,变成横屏后,两侧的画面看不到了
改用ffmpeg -i 3.mp4 -vf transpose=1 rotate8.mp4解决了问题

14.视频合成

ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg

对于非 MPEG 格式容器,但是是 MPEG 编码器(H.264、DivX、XviD、MPEG4、MPEG2、AAC、MP2、MP3 等),可以包装进 TS 格式的容器再合并。在新浪视频,有很多视频使用 H.264 编码器,可以采用这个方法

ffmpeg -i input1.flv -c copy -bsf:v h264_mp4toannexb -f mpegts input1.ts
 
ffmpeg -i input2.flv -c copy -bsf:v h264_mp4toannexb -f mpegts input2.ts
 
ffmpeg -i input3.flv -c copy -bsf:v h264_mp4toannexb -f mpegts input3.ts
 
ffmpeg -i "concat:input1.ts|input2.ts|input3.ts" -c copy -bsf:a aac_adtstoasc -movflags +faststart output.mp4

15.其他用例
将4个视频拼接成一个很长的视频
横向拼接2个视频
查看视频总帧数
图片转视频
图片格式转换