ffmpeg基础命令
-
编码转换–01
source:被转换视频
acodec:用来指定音频编码器
libmp3lame:mp3编码器
ar:设置音频采样率,默认使用原音频采样率。一般为48hz和44.1hz
ab:指定音频的比特率,默认为128k
ac:用来设置声道数,1表示单声道,2表示双声道立体声,默认采用原音频的声道数
dst:转换后视频
ffmpeg -i sorce -acodec libmp3lame -ar 44100 -ab 320k -ac 2 dst
-
属性查看
ffprobe source
-
编码转换–02
s:缩放视频尺寸,后面的数值即为新视频的尺寸
pix_fmt:设置颜色缩放空间
vcodec:用来设置视频流的编码格式
preset:编码器预设
profile:v:用来指定编码器的配置,这个配置主要与压缩比有关
level:v:对编码器具体配置的规范和限制
crf:用来设置码率控制模式,0表示无损画质
r:设置每秒的帧数
b:a:用来设置比特率
ffmpeg -i souce -s 1920X1080 -pix_fmt yuv420p -vcodec libx264 -preset medium -profile:v high -level:v 4.1 -crf 23 -r 30 -b:a 128k dst
-
码率控制模式
画质越好,要求的码率就越高,文件体积也越大。所谓的码率控制,就是为每一帧画面分配多少比特数,这是在权衡文件体积和画面质量。ffmpeg一共支持3中码率控制模式,分别为-qp,-crf,-b。
-
qp(Constant Quantizer)恒定量化器模式
量化器指利用特殊算法,将画质转化为数字。这样,每一帧画质都可以通过这些量化参数来进行判定,这些量化参数是可以手动设置的(不建议)。
在qp模式下,画质被划分为0~51个级别,0代表无损画质。用qb模式压制视频,每一帧画质级别都能达到设置好的质量,严格遵循量化参数来编码,这么一来,它的画质是最好的,体积也是最大的,非常非常大,所以一般不使用这种码率控制模式,除非想无损压制视频。
无损压缩的例子(快速编码) ffmpeg -i souce -vcodec libx264 -preset ultrafast -qp 0 dst 无损压缩的例子(高压缩比) ffmpeg -i input -vcodec libx264 -preset veryslow -qp 0 dst
-
crf(Constant Rate Factor)恒定速率因子模式
crf模式就是一个浮动的qp模式,它按照特定的标准根据人眼的特点给予每帧画面不同的量化参数。某些画面的质量高一点或者低一点是人眼难以察觉的,那么我们可以降低一点码率,然后把这些省下来的码率用到视觉敏感的画面里,这么以来,画质的变化不大,但码率却降低了不少,文件体积自然也变小了。至于浮动范围,我们也可以手动设置(不推荐)。这是最适合大众的码率控制模式,我们一般视频就用它。
-
b(bitrate )固定目标码率模式
使最终文件的整体码率与我们给定的码率相等,这么一来,视频文件的体积和码率都是确定的,可用于对视频码率和体积有限制的情景。一般网站都有这方面的限制,如果有视频上传需求,并且希望在有限条件下达到最高画质,可以考虑使用这种码率控制模式。
以上三种模式默认都是单遍编码, 在使用qp或crf模式的时候,最好搭配veryslow预设,这样以来,参数控制更精准一些。b模式默认采用VBR(Variable Bit Rate/动态比特率)编码,简单的内容少给码率,复杂的内容多给码率。现在的网络视频都是采用ABR(Average Bit Rate/平均比特率)来编码,如果VBR的码率变化太大,用户的设备和网络又不好的情况下,很容易造成花屏或者黑屏。CBR(Constant Bit Rate/恒定比特率),是在ABR的基础上附加一些指令,让码率尽可能的固定在一个数值上,这种方式几乎无人使用。
-
-
提取视频
copy:保持原编码格式
an:用来实现静音,即剔除音效
ffmpeg -i source -vcodec copy -an dst
-
提取音频
copy:保持原编码格式
vn:剔除视频,保留音频
ffmpeg -i source -acodec copy -vn dst
如果某一个视频具备多个音频流,如果要提取Stream #0:3[0x82]这个音频流,我们要多加一个参数 -map 0:3
-
合并视频和音频
ffmpeg -i source1 -i source2 -c copy dst
-
截取音频
ss:截取音频的起始时间,格式为00:00:00(时:分:秒)
to:截取音频的结束时间,格式如上
t:设置截取时间,单位为s
sseof:以音频末尾为标点,结合t可截取末尾多少秒
ffmpeg -i source -ss 00:01:00 -to 00:01:10 -acodec copy dst
针对-i和-ss参数的位置不同,结果也有差异:
ffmpeg -i source -ss 00:01:00 -to 00:01:10 -c copy dst ffmpeg -ss 00:01:00 -i source -to 00:01:10 -c copy dst ffmpeg -ss 00:01:00 -i source -to 00:01:10 -c copy -copyts dst
当我们将-ss参数放在-i参数之前时,ffmpeg会启用关键帧技术,这可以加速截取操作。但是这样截取出来的额视频,在播放器的显示中,它的起始时间和结束时间不一定准确。我们可以通过第三条命令进行改进,它保留了时间戳,这样就可以保证时间的准确性。
-
音视频连接
ffmpeg -i "concat:source1|source2|source3" -c copy dst
视频参数不一致时,也可以进行音视频连接。但是,操作起来非常麻烦。可以使用Avidemux这款开源免费软件,专门用来截切合并视频,有图形界面,易于操作。
-
图片截取
截取第5秒的第一帧画面,vframes用来指定第几帧
ffmpeg -i source -ss 5 -vframes 1 dst
-
在视频中添加水印
filter_complex:用来添加滤镜(这里的滤镜则为要添加的水印)
“overlay=20:20”:表示水印在离左边20个像素,离顶部20个像素的位置
ffmpeg -i source1 -i source2 -filter_complex "overlay=20:20"
-
制作gif动图
ffmpeg -i source -ss 7.5 -to 8.5 -s 640x320 -r 15 dst.gif
-
屏幕录制
f:格式化指令
ffmpeg -f gdigrab -i desktop dst
gdigrab是ffmpeg的一个组件,用来捕获视频设备,不同的操作系统它的视频捕获工具也不一样。在windows系统中,ffmpeg默认使用的就是gdigrab,它目前只支持捕获视频,不支持捕获音频。如果我们需要录屏,录音,获取摄像头和麦克风的话,推荐使用OBS Studio,开源免费。
-
录播
re:让软件按照视频的帧率进行推流
ffmpeg -re -i source 按照网站要求编码 -f flv "你的rtmp地址/你的直播码"