欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ffmpeg基本命令

程序员文章站 2022-07-13 13:22:41
...

1.普通格式转换
ffmpeg -i input.avi output.mp4
从选项指定的任意数量的输入“文件”(可以是常规文件,管道,网络流,抓取设备等)读取 -i,并写入任意数量的输出“文件”,由一个简单的输出url。在命令行上发现的任何不能被解释为选项的内容都被认为是输出url。
2. 提取音频

 ffmpeg -i input.mp4 -acodec copy -vn output.aac 
//上面的命令,默认mp4的audio codec是aac,如果不是,可以都转为最常见的aac。 
ffmpeg -i input.mp4 -acodec aac -vn output.aac

3.提取视频

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

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表示要切多少。上面就是从15秒开始,切5秒钟出来。
5.码率、帧率和文件大小
概述
码率和帧率是视频文件的最重要的基本特征,对于他们的特有设置会决定视频质量。如果我们知道码率和时长那么可以很容易计算出输出文件的大小。

帧率:帧率也叫帧频率,帧率是视频文件中每一秒的帧数,肉眼想看到连续移动图像至少需要15帧。
码率:比特率(也叫码率,数据率)是一个确定整体视频/音频质量的参数,秒为单位处理的字节数,码率和视频质量成正比,在视频文件中中比特率用bps来表达。
帧率
①用 -r 参数设置帧率

ffmpeg –i input –r fps output

②用fps filter设置帧率

ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm

帧率的预定义值:
例如设置码率为29.97fps,下面三种方式具有相同的结果:

ffmpeg -i input.avi -r 29.97 output.mpg
ffmpeg -i input.avi -r 30000/1001 output.mpg
ffmpeg -i input.avi -r netsc output.mpg

码率
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

音频:-b:a 视频: - b:v
设置视频码率为1500kbps

ffmpeg -i input.avi -b:v 1500k output.mp4

控制输出文件大小
-fs (file size首字母缩写)

ffmpeg -i input.avi -fs 1024K output.mp4

计算输出文件大小
(视频码率+音频码率) * 时长 /8 = 文件大小K
6.调整视频分辨率
①用-s参数设置视频分辨率,参数值wxh,w宽度单位是像素,h高度单位是像素

ffmpeg -i input_file -s 320x240 output_file

②预定义的视频尺寸
下面两条命令有相同效果

ffmpeg -i input.avi -s 640x480 output.avi
ffmpeg -i input.avi -s vga output.avi

下表列出了所有的预定义尺寸
ffmpeg基本命令

Scale filter调整分辨率
Scale filter的优点是可以使用一些额外的参数
语法:

Scale=width:height[:interl={1|-1}]

下表列出了常用的额外参数
举例
下面两条命令有相同效果

ffmpeg -i input.mpg -s 320x240 output.mp4 
ffmpeg -i input.mpg -vf scale=320:240 output.mp4

对输入视频成比例缩放
改变为源视频一半大小

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

改变为原视频的90%大小:

ffmpeg -i input.mpg -vf scale=iw*0.9:ih*0.9 output.mp4

举例
在未知视频的分辨率时,保证调整的分辨率与源视频有相同的横纵比。
宽度固定400,高度成比例:

ffmpeg -i input.avi -vf scale=400:400/a
ffmpeg -i input.avi -vf scale=400:-1

相反地,高度固定300,宽度成比例:

ffmpeg -i input.avi -vf scale=-1:300
ffmpeg -i input.avi -vf scale=300*a:300

7.裁剪/填充视频
裁剪视频crop filter
从输入文件中选取你想要的矩形区域到输出文件中,常见用来去视频黑边。
语法:crop:ow[:oh[:x[:y:[:keep_aspect]]]]

举例
裁剪输入视频的左三分之一,中间三分之一,右三分之一:

ffmpeg -i input -vf crop=iw/3:ih :0:0 output 
ffmpeg -i input -vf crop=iw/3:ih :iw/3:0 output 
ffmpeg -i input -vf crop=iw/3:ih :iw/3*2:0 output

裁剪帧的中心
当我们想裁剪区域在帧的中间时,裁剪filter可以跳过输入x和y值,他们的默认值是
Xdefault = ( input width - output width)/2
Ydefault = ( input height - output height)/2

ffmpeg -i input_file -v crop=w:h output_file

裁剪中间一半区域:

ffmpeg -i input.avi -vf crop=iw/2:ih/2 output.avi

填充视频(pad)
在视频帧上增加一快额外额区域,经常用在播放的时候显示不同的横纵比
语法:pad=width[:height:[:x[:y:[:color]]]]

举例
创建一个30个像素的粉色宽度来包围一个SVGA尺寸的图片:

ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg

860:660为填充之后的尺寸

同理可以制作testsrc视频用30个像素粉色包围视频

ffmpeg  -f lavfi -i testsrc -vf pad=iw+60:ih+60:30:30:pink

4:3到16:9
一些设备只能播放16:9的横纵比,4:3的横纵比必须在水平方向的两边填充成16:9,

高度被保持,宽度等于高度乘以16/9,x(输入文件水平位移)值由表达式(output_width - input_width)/2来计算。

4:3到16:9的通用命令是:

ffmpeg -i input -vf pad=ih*16/9:ih :(ow-iw)/2:0:color output

16:9到4:3
为了用4:3的横纵比来显示16:9的横纵比,填充输入文件的垂直两边,宽度保持不变,高度是宽度的3/4,y值(输入文件的垂直偏移量)是由一个表达式(output_height-input_height)/2计算出来的。

16:9到4:3的通用命令:

ffmpeg -i input -vf pad=iw :iw*3/4:0:(oh-ih)/2:color output

8.翻转和旋转
翻转
水平翻转语法: -vf hflip

ffmpeg -i input -vf hflip output

垂直翻转语法:-vf vflip

ffmpeg -i input -vf vflip   output

旋转
语法:transpose={0,1,2,3}
0:逆时针旋转90°然后垂直翻转
1:顺时针旋转90°
2:逆时针旋转90°
3:顺时针旋转90°然后水平翻转

ffmpeg -i input -vf transpose={0,1,2,3} output

8. 过滤器的使用
8.1 将输入的1920x1080缩小到960x540输出:

ffmpeg -i input.mp4 -vf scale=960:540 output.mp4 

//ps: 如果540不写,写成-1,即scale=960:-1, 那也是可以的,ffmpeg会通知缩放滤镜在输出时保持原始的宽高比。
8.2 为视频添加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

8.3 去掉视频的logo

语法:-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