FFmpeg(全称:Fast Forward Mpeg),名称来自MPEG视频编码标准。FFmpeg是一套用来处理视频和音频的开源工具库。它提供了录制、转换、流化音视频以及后期处理的完整解决方案。有很高的质量和可移植性。
在Mac环境中,直接使用Homebrew (mac包管理工具)安装FFmpeg。
没安装的可以参考mac安装Homebrew。也可以官网下载不同平台安装包。
1、在终端中输入brew install ffmpeg
安装,最后使用命令ffmpeg -version
查看查看版本确认是否安装成功。
2、进入上一步的安装目录,打开目录位置:
cd /usr/local/Cellar/ffmpeg
open .
目录结构说明:
函数库:
基本概念:
一个简单的转码命令可以这样写:将input.avi转码成output.ts,并设置视频的码率为640kbps
ffmpeg -i input.avi -b:v 640k output.ts
一个简单的播放命令可以这样写:播放test.avi
ffplay test.avi
ffmpeg - h 帮助命令可以查看更多参数
eg: ffmpeg -i test.mp4 output.mov
将test视频文件输出为mov文件:
执行命令 ffmpeg -codecs
查看编解码方式,一般的视频网站用的是
以上适合1080p及其之下分辨率的编码方案
eg:执行命令 ffmpeg -i test2.m4a -acodec libmp3lame -ar 44100 -ab 320k -ac 2 out.mp3
,参数说明:
eg:执行命令 ffmpeg -i test.mp4 -s 1920x1080 -pix_fmt yuv420p -vcodec libx264 -preset medium -profile:v high -level:v 4.1 -crf 23 -acodec aac -ar 44100 -ac 2 -b:a 128k out.mp4
,参数说明:
- profile:v 指定编码器配置(和压缩比有关),压缩都狠,体积占用小,画面损失多。
通讯领域一般用baseline,流媒体一般main,超清视频high
ffmpeg码率控制模式:
- -qp 恒定量化器模式(每一帧都可以不同量化处理,没必要,一般不使用)
- -crf Constant Rate Factor 恒定速率因子模式 (常用)
- -b 固定目标码率模式(一般不使用,适用于对码率和体积有限制的情况)
这三种默认都是单遍编码
vbr 动态码率
abr 平均比特率(目前视频经常用)
cbr恒定比特率(没人用)
ffmpeg -i test.mp4 -vcodec copy -an v.mp4
将音频剔除,获取视频
ffmpeg -i test.mp4 -acodec copy -vn v.m4a
将视频剔除,获取音频
将音频视频合并回去,由于刚刚从一个视频中分离的合并回去也不需要特殊处理,执行ffmpeg -i v.mp4 -i v.m4a -c copy hebing.mp4
即可,如果对不上的需要用其他命令处理。
ffmpeg -i test.mp4 -ss 00:01:00 -to 00:01:10 -acodec copy out.mp4
截取铃声ffmpeg -i test.mp4 -ss 00:01:00 -t 10 -acodec copy out.mp4
截取铃声,也可以这样写ffmpeg -ss 00:01:00 -i test.mp4 -to 00:01:10 -c copy -copyts out.mp4
截取视频,会启用关键帧技术,copyts保留时间戳ffmpeg -sseof -10 -i test.mp4 out.mp4
ffmpeg -ss 00:01:00 -i test.mp4 -to 00:01:10 -c copy -y -threads 4 -preset ultrafast -strict -2 out.mp4
截取视频参数解析:
-codec
和-c
是等价的,可以为指定的流设置编码器。-vcodec
和-c:v
是等价的,指定视频解码器。- 设定音频比特率: -ab bitrate(audio bitrate ),推荐改为使用
-b:a
。设定视频比特率:-b bitrate(video bitrate),推荐改为使用-b:v
- 使用 -i 选项选择网络源地址,
- -c 参数表示选择编码器类型
- -ss 指定开始时间,然后用 -to 指定结束时间
- copy 模式将原视频文件编码格式直接拷贝为新格式的视频
- -y 表示如果存在与指定的文件名相同的文件就覆盖掉原有的文件
- -threads 5 -preset ultrafast 多线程转码。ffmpeg配线程数只针对解码,不针对编码。 设置 preset 预设参数为 ultrafast 进行转码。
- -strict -2 之前是实验参数表示 aac音频编码 如果不使用aac音频编码使用使其的编码好像还需要导入第三方的音频编码库 比较麻烦 使用FFmpeg自带的aac音频编码要带上-strict -2 参数就可以了。带这个参数是为了使用aac音频编码。
音频视频的连接有多种方法,常用的有如下两种,推荐使用第二种:FFmpeg concat 分离器。
方法一:FFmpeg concat 协议
对于 MPEG 格式的视频,可以直接连接: 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
保存 QuickTime/MP4 格式容器的时候,建议加上 -movflags +faststart。这样分享文件给别人的时候可以边下边看。
方法二:FFmpeg concat 分离器
这种方法成功率很高,也是最好的,但是需要 FFmpeg 1.1 以上版本。先创建一个文本文件 filelist.txt,然后执行命令: ffmpeg -f concat -i filelist.txt -c copy output.mp4
注意:使用 FFmpeg concat 分离器时,如果文件名有奇怪的字符,要在 filelist.txt 中转义。
ffmpeg -i test.mp4 -ss 5 -vframes 1 img.jpg
截取第几秒第几帧图片
ffmpeg -i test.mp4 -i logo.jpg -filter_complex "overlay=20:20" out.mp4
给视频加水印logo
ffmpeg -i test.mp4 -ss 10 -to 10.5 -s 640x320 -r 15 out.gif
处理一下帧率和大小,生成动图
滤镜指的是在编码之前针对解码器解码出来的原始数据(即音视频帧)进行处理的动作,我们还可以称它为过滤器。
ffmpeg内置了大概近400种滤镜,我们可以用 ffmpeg -filters 命令查看所有的滤镜
,也可以用命令 ffmpeg -h filter=xxx 或者查看官方文档了解每一种滤镜。
scale滤镜用于调整视频的大小,比如等比例缩放、等比例放大
in_w in_h 或者 iw ih 表示输入视频的宽高
out_w out_h 或者 ow oh 表示输出视频的宽高
复杂滤镜用命令 -filter_complex 表示,它还有一个别名 -lavfi。
-filter_complex
: 相比-vf(-vf 是 -filter:v 的简写), filter_complex适合开发复杂的滤镜功能,如同时对视频进行裁剪并旋转。参数之间使用逗号(,)隔开即可main_w
:视频宽度overlay_w
: 要添加的图片水印宽度main_h
: 视频高度overlay_h
:要添加的图片水印宽度
ffmpeg -f gdgrab -i desktop rec.mp4
只能单存的录屏
说明:-f 格式化 gdgrab组件是视频捕获工具,不能捕获音频,不同操作系统视频捕获工具不同,window目前用gdgrab。
推荐组件:OBS Studio免费稳定强大,window下限制太多。
字幕操作分为软字幕(推荐)和硬字幕,软字幕即给视频流添加字幕流的方式,可分离,硬字幕(不推荐)将字幕嵌入到视频帧中,这个过程需要重新编解码,所以速度比较慢。而且不可逆.
创建一个txt,重命名为字幕文件格式zm.srt,修改内容如下(注意需要空行):
执行命令:ffmpeg -i test.mp4 -vf subtitles=zm.srt out.mp4
即可。