一.ffmpeg下载与安装
在官网https://ffmpeg.zeranoe.com/builds/中,下载static版本的ffmpeg文件,解压后里面的bin文件夹里包含了三个.exe文件,其中:
ffmpeg.exe:进行音视频格式转换
ffplay.exe:能够进行音视频播放
ffprobe.exe:查看音视频文件的详细信息
为能够在任何目录下使用这些工具,需要进行环境变量的配置,参考步骤如下:
https://jingyan.baidu.com/article/a17d5285c9b0c48099c8f26a.html
二. 常用命令
更多关于ffmpeg命令的参数,可参考:
https://blog.csdn.net/leixiaohua1020/article/details/12751349
主要参数:
-i 设定输入流
-f 设定输出格式
-ss 开始时间
-t 持续时间
视频参数:
-b 设定视频流量(码率),默认为200Kbit/s
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数:
-ab 设置音频码率
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频
音频参数前的a,表示音频audio处理,因此,ar:audio resample;c:audio channels;
1.视频格式转换
ffmpeg.exe -i VID.mp4 VID_mp4_to_avi.avi
将mp4格式的文件转为avi
2.从视频中提取音频
ffmpeg -i VID.mp4 -acoder aac -vn output.acc
采用音频编解码-acodec,并用-vn移除视频,不对视频做处理
或
ffmpeg -i VID.mp4 -acoder copy -vn output.acc
3.提取视频
ffmpeg -i VID.avi -acodec copy -an VID_no_audio.avi
移除音视频中的音频-an
在实现过程中发现,这个操作对MP4格式不管用,因此可将MP4转为avi格式,再进行音频移除操作
4.视频剪切
ffmpeg -ss 00:00:02 -t 00:00:03 -i input.avi output avi
-ss:为开始切割的时间 -t:表示要切多少时长,上面代码表示从第2秒开始切,切3s时长
5.码率控制
码率控制对于在线视频比较重要。因为在线视频需要考虑其能提供的带宽。
码率(kbps)=文件大小(bit)*8/时长(s)/1000
如:文件大小为20.8M,时长为1分钟,码率的计算为
bitrate=20.8Mbit/60s=20.8*1024*1024*8bit/60s/1024=2839kbps
若音频的码率为128kbps,那么视频的码率为(2839-128)kbps
ffmpeg控制码率的三种选择:
-minrate -b:v -maxrate
- -b:v:主要是控制平均码率。若一个文件的码率太高,导致文件太大,需要把文件弄小点,但又不破坏分辨率
ffmpeg -i input.avi -b:v 2000k output.avi
上面的操作实现将原码率转为2000kbps
- 不过,ffmpeg官方wiki建议,同时加上-bufsize,用于设置码率控制缓冲器的大小,设置的好处是让整体码率更趋于希望的值,减少波动。(简单来说,比如1 2的平均值是1.5, 1.49 1.51 也是1.5, 当然是第二种比较好)
ffmpeg -i input.avi -b:v 2000k -bufsize 2000k output.avi
- -minrate,-maxrate:在线视频有时候,希望码率的波动,不要超过某个阈值
ffmpeg -i input.avi -b:v 2000k -bufsize 2000k -maxrate 2500k output.avi
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.将输出的1920*1080缩小到960*540输出:
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
8.为视频添加logo
ffmpeg -i input.mp4 -i iQIYI_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
如下,将
作为下图的logo
得到
9.去除文件logo
用ffmpeg的delogo过滤器。
语法:-vf delogo=x:y:w:h[:t[:show]]
x:y 离左上角的坐标
w:h logo的宽和高
t: 矩形边缘的厚度默认值4
show:若设置为1有一个绿色的矩形,默认值0。
ffmpeg -i input.mp4 -vf delogo=0:0:220:90:100:1 output.mp4
如:对8中的图像进行去logo,得到
10. 抓取视频的帧,存为jpeg图片
比如:一个视频,提取一些帧,存为jpeg图片,可表示为:
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%3d.jpeg
其中
-r:表示一秒保存几帧
-q:v:表示存储的图片质量,2为高质量
-f:表示输出的格式,image2表示为图片格式(PS:-f:image2这一块可以缺省)
pic_%3d.jpeg:表示为输出的图片名称
若只截取一段时间的图片,则可表示为:
ffmpeg -i input.mp4 -ss 00:00:02 -t 00:00:05 -r 1 -q:v 2 -f image2 pic-%3d.jpeg
上述代码可表示为从第2秒开始截取,直至截取5秒的长度,即到第7秒 ,得到5张图片
本篇论文参考网址为:
https://www.jianshu.com/p/ddafe46827b7
https://blog.csdn.net/newchenxf/article/details/51364105
更多关于ffmpeg的用法可见: