一、什么是FFmpeg?
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。
二、安装FFmpeg
在Ubuntu中安装FFmpeg非常简单,只需在终端中输入如下命令即可自动安装:
sudo apt-get install ffmpeg
三、常用参数解释
-i 设定输入流
-f 设定输出格式
-ss 开始时间
# 视频参数
-b 设定视频流量(码率),默认为200Kbit/s
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
# 音频参数
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频
四、常用功能的使用方法
1.视频格式转换
比如avi转mp4,或者mp4转ts
ffmpeg -i input.avi output.mp4
ffmpeg -i input.mp4 output.ts
2. 提取音频
ffmpeg -i input.mp4 -acodec copy -vn output.aac
上面的命令,默认mp4的audio codec是aac,如果不是会出错,咱可以暴力一点,不管什么音频,都转为最常见的aac。
ffmpeg -i input.mp4 -acodec acc -vn output.aac
-vn: 不处理视频
3.提取视频
将带有音频的视频提取为纯视频:
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
-an :不处理音频
4. 视频剪切
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
-ss表示开始切割的时间,-t表示要切多少。上面就是从开始,切5秒钟出来。
注意一个问题,ffmpeg 在切割视频的时候无法做到时间绝对准确,因为视频编码中关键帧(I帧)和跟随它的B帧、P帧是无法分割开的,否则就需要进行重新帧内编码,会让视频体积增大。所以,如果切割的位置刚好在两个关键帧中间,那么 ffmpeg 会向前/向后切割,所以最后切割出的 chunk 长度总是会大于等于应有的长度。
5. 码率控制
码率控制对于在线视频比较重要。因为在线视频需要考虑其能提供的带宽。那么,什么是码率?很简单:bitrate = file size / duration,比如一个文件20.8M,时长1分钟,那么,码率就是:biterate = 20.8M bit/60s = 20.8*1024*1024*8 bit/60s= 2831Kbps
一般音频的码率只有固定几种,比如是128Kbps, 那么,video的就是:video biterate = 2831Kbps -128Kbps = 2703Kbps。说完背景了。好了,来说ffmpeg如何控制码率。 ffmpg控制码率有3种选择,-minrate -b:v -maxrate
ffmpeg -i input.mp4 -b:v 2000k output.mp4
不过,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
当然了,如果ffmpeg当时编译时,添加了外部的x265或者X264,那也可以用外部的编码器来编码。(不知道什么是X265,可以Google一下,简单的说,就是她不包含在ffmpeg的源码里,是独立的一个开源代码,用于编码HEVC,ffmpeg编码时可以调用它。当然了,ffmpeg自己也有编码器)
ffmpeg -i input.mp4 -c:v libx265 output.mp4
ffmpeg -i input.mp4 -c:v libx264 output.mp4
7.只提取视频ES数据
ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264
8.过滤器的使用
参考:ffmpeg filter过滤器 基础实例及全面解析
例1:将输入的1920x1080缩小到960x540输出
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
//ps: 如果540不写,写成-1,即scale=960:-1, 那也是可以的,ffmpeg会通知缩放滤镜在输出时保持原始的宽高比。
例2:为视频添加logo
./ffmpeg -i input.mp4 -i iQIYI_logo.png -filter_complex overlay output.mp4
9.从视频中提取图像帧
ffmpeg -i test.mp4 -r 1 PATH/TO/IMAGE/image-%05d.jpeg
# -r,指定抽取视频的帧率,即从视频中每秒抽取的帧数,默认是每秒24帧。image-%5d.jpeg,指定输出文件的名字。
ffmpeg -i test.mp4 -r 1 -t 4 PATH/TO/IMAGE/image-%05d.jpeg
# -t,表示取t秒时间的帧
ffmpeg -i test.mp4 -r 1 -ss 00:00:40 PATH/TO/IMAGE/image-%05d.jpeg
# -ss,表示截取帧初始时间
ffmpeg -i test.mp4 -r 1 -ss 00:00:40 -vframes 10 PATH/TO/IMAGE/image-%05d.jpeg
# -vframes,表示截取多少帧
全文参考:https://www.jianshu.com/p/ddafe46827b7