ffmpeg音视频处理
ffmpeg音视频处理
文章目录
一、ffmpeg的简介
FFmpeg(全称:Fast Forward Mpeg),名称来自MPEG视频编码标准。FFmpeg是一套用来处理视频和音频的开源工具库。它提供了录制、转换、流化音视频以及后期处理的完整解决方案。有很高的质量和可移植性。
二、ffmpeg的安装
在Mac环境中,直接使用Homebrew (mac包管理工具)安装FFmpeg。
没安装的可以参考 。也可以 不同平台安装包。
1、在终端中输入
brew install ffmpeg
安装,最后使用命令
ffmpeg -version
查看查看版本确认是否安装成功。
2、进入上一步的安装目录,打开目录位置:
cd /usr/local/Cellar/ffmpeg
open .
目录结构说明:
bin:有编译好的可执行程序:ffmpeg、ffplay、ffprobe等,可以直接在命令行上使用。
eg: ffplay xx.mp4:可以直接播放某个视频
eg:ffmpeg -version:可以查看FFmpeg的版本号
include:开发时需要包含的头文件
lib:链接时需要用到的库文件
函数库:
- libavcodec:编解码库。
- libavformat:音视频容器格式以及所支持的协议的封装和解析。
- libavutil:提供了一些公共函数,工具库。
- libavfilter:音视频的滤镜库,如视频加水印、音频变声等。
- libavdevice:支持众多设备数据的输入与输出,如读取摄像头数据、屏幕录制。
- libswresample, libavresample:提供音频的重采样工具库。
- libswscale:提供对视频图像进行色彩转换、缩放以及像素格式转换,如图像的 YUV 转换。
- libpostproc:多媒体后处理器。
基本概念:
容器(Container)
容器就是一种文件格式,比如flv,mkv等。包含下面5种流以及文件头信息。
流(Stream)
是一种视频数据信息的传输方式,5种流:音频,视频,字幕,附件,数据。
帧(Frame)
帧代表一幅静止的图像,分为I帧,P帧,B帧。
编解码器(Codec)
是对视频进行压缩或者解压缩,CODEC =COde (编码) +DECode(解码)
复用/解复用(mux/demux)
把不同的流按照某种容器的规则放入容器,这种行为叫做复用(mux)
把不同的流从某种容器中解析出来,这种行为叫做解复用(demux)
三、ffmpeg、ffplay、ffprobe区别
1、ffmpeg是用于转码的应用程序
一个简单的转码命令可以这样写:将input.avi转码成output.ts,并设置视频的码率为640kbps
ffmpeg -i input.avi -b:v 640k output.ts
2、ffplay是用于播放的应用程序
一个简单的播放命令可以这样写:播放test.avi
ffplay test.avi
3、ffprobe是用于查看文件格式的应用程序
ffmpeg - h 帮助命令可以查看更多参数
四、常见的文件格式、编码
1、常见的视频格式、文件格式
eg:
ffmpeg -i test.mp4 output.mov
将test视频文件输出为mov文件:
2、常见的编码音频转码
执行命令
ffmpeg -codecs
查看编解码方式,一般的视频网站用的是
- MP4封装:H264视频编码+AAC音频编码(比较成熟)
- WebM封装:VP8视频编码+Vorbis音频编码(谷歌方案)
- OGG封装:Theora视频编码+Vorbis音频编码(开源)
以上适合1080p及其之下分辨率的编码方案
eg:执行命令
ffmpeg -i test2.m4a -acodec libmp3lame -ar 44100 -ab 320k -ac 2 out.mp3
,参数说明:
- acodec 指定音频编码器
- libmp3lame 指定mp3编码器
- ar 音频采样率 。不输入默认采用原音频的采样率:48khz、44.1hz
- ab 指定音频比特率 。不输入默认128k
- ac 设置声道数目,1单声道,2双声道
五、视频压制
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
,参数说明:
- s 缩放视频尺寸
- pix_fmt 设置视频颜色空间。 网络视频通常用:yuv420p
- vcodec 网络视频编码器指令。libx264 软件编码器 通用稳定
- preset 编码器预设(共10个参数可选),一般录制时选用veryfast,压制时一般采用veryslow
- profile:v 指定编码器配置(和压缩比有关),压缩都狠,体积占用小,画面损失多。
通讯领域一般用baseline,流媒体一般main,超清视频high
level:v 编码器的具体规范和限制(1~5.2) 一般1080p的用4.1
crf 码率控制模式。
0-51数值越小,质量越高,0就是无损,默认值23,一般在10-28间选择(适用于画质有要求,文件大小无要求的场景)
b:a 音频比特率一般128k 或192
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
即可,如果对不上的需要用其他命令处理。
七、截取、连接音视频
1、截取视频音频
截取视频10s:
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保留时间戳截取视频后10s:
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音频编码。
2、音频视频的连接
音频视频的连接有多种方法,常用的有如下两种,推荐使用第二种: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
即可。
更多字幕操作请参考 学习