一、FFmpeg简介
FFmpeg是什么
学习音视频开发,FFmpeg是一座绕不开的大山。一句话描述FFmpeg是啥?
FFmpeg是一个开源软件,可以运行音频和视频多种格式的录影、转换、流功能。用官网的话说,A complete, cross-platform solution to record, convert and stream audio and video.
『FFmpeg官网传送门』,目前支持Linux,Mac OS,Windows三个主流的平台,可以直接下载使用。
FFmpeg基本组成
FFmpeg框架有以下几部分组成:
- AVformat:封装模块,对应libavformat库,实现了绝大多数媒体封装格式的封装和解封装。如MP4、FLV、TS等文件封装格式,以及RTMP、RTSP、MMS、HLS等网络协议封装格式。
- AVCodec:编解码模块,对应libavcodec库,实现了大多数常用的编解码格式,如MPEG4、AAC、MJPEG等自带编码格式外,还支持H.264(AVC)的x264编码器、H.265(HEVC)的x265编码器,MP3的libmp3lame编码器等第三方的编解码器。
- AVFilter,滤镜模块,对应libavfilter库,提供了一个通用的音视频字幕等滤镜处理框架。
- AVDevice、AVUtil、swscale、swresample等其他模块
从提供的工具来看,有以下3个:
SDL(Simple DirectMedia Layer)
SDL是一套开放源代码的跨平台多媒体开发库,使用C语言写成。可封装了复杂的视音频底层操作,简化了视音频处理的难度。
二、FFmpeg安装
当然也可以自己编译到Android或者iOS平台。
Mac安装
有之前有安装过,版本或模块有问题,可先brew uninstall卸载。然后使用brew安装即可。
1 | $ brew install ffmpeg --with-libvpx --with-libvorbis --with-ffplay |
Linux 安装
详细资料可参考官方文档,『文档传送门』
1 | # 安装依赖包 |
Windows 安装
Windows平台的编译较为繁琐,需要MinGW-w64+MSYS环境,建议初学者直接官网下载编译好的对应操作系统版本的ffmpeg包即可,然后在path系统变量中进行安装路径配置。
功能定制
如需要其他模块,则需要通过三方外部库的方式支持,需要一并打包编译。如默认支持的格式不需要,可以裁剪来缩小FFmpeg的体积。
三、FFmpeg使用基础
常用参数
1、主要参数
参数 | 说明 |
---|---|
-i | 设定输入流 |
-f | 设定输出格式 |
-ss | 指定开始时间 |
-t | 指定时长 |
-y | 覆盖已有输出文件,对应的是-n不覆盖 |
-re | 按照帧率发送,主要用于模拟捕获设备 |
2、视频参数
参数 | 说明 |
---|---|
-vcodec | 设定视频编解码器,值copy代表与输入流相同,也可使用-c:v |
-b | 设定视频流量,VBR,默认为200Kbit/s,也可使用-b:v |
-r | 设定帧速率,默认为25 |
-s | 设定画面的宽与高(1920x1080) |
-aspect | 设定画面的比例 |
-vn | 不处理视频 |
3、音频参数
参数 | 说明 |
---|---|
-acodec | 设定声音编解码器,默认与输入流相同 |
-ar | 设定采样率 |
-ac | 设定声音的声道数(Channel),缺省为1 |
-an | 不处理音频 |
-ab | 设置音频码率,也可使用-b:a |
1 | $ ffmpeg -i .\input10.mp4 -b:v 1000k -s 1280x720 output.mp4 #基础 |
FFmpeg工作流程
- 输入源
- 解封装(Demuxing),通过AVFormat模块的接口Demuxer进行解封装
- 解码(Decoding),通过AVCodec模块的接口Decoder解码成YVU/PCM数据
- 编码(Encoding),通过AVCodec模块的接口Encoder进行编码
- 封装(Muxing),通过AVFormat模块的接口Muxer进行封装
- 输出流
封装转换可使用AVFormat模块libavformat库的AVFormatContext公用参数。
编解码采用AVCodec模块libavcodec库的AVCodecContext公用参数。
AVCodecContext公用参数有:
参数 | 说明 |
---|---|
b | 设定音视频总体码率,默认为200Kbit/s,可用b:v设置视频码率,b:a设置音频码率 |
g | 设置视频GOP(关键帧间隔),默认时12帧一个GOP |
ab | 设定音频码率 |
ar | 设定音频采样率,默认为0 |
ac | 设定音频通道数,默认为0 |
bf | 设定连续编码为B帧的个数,默认为0 |
threads | 设置编解码工作的线程数,避免打满cpu |
模块支持常用命令
FFmpeg命令较多,可使用ffmpeg -h来获取帮助。
FFmpeg本身支持部分编码格式、文件封装和流媒体传输协议,对于下载好的ffmpeg,可以使用ffmpeg -version或ffmpeg -buildconf命令查看编译时的参数和版本。
1 | $ ffmpeg -version |
可使用以下命令查看ffmpeg支持的编码器、解码器、封装格式、解封装格式、通信协议。
命令 | 说明 | 示例 |
---|---|---|
ffmpeg -encoders | 编码器 | YUV4、PCM_* |
ffmpeg -decoders | 解码器 | H264、VP9 |
ffmpeg -muxers | 封装格式 | mp4、flv |
ffmpeg -demuxers | 解封装格式 | mpeg、mpegts、flv、aac |
ffmpeg -protocols | 通信协议 | http、rtmp |
可以使用ffmpeg -formats来查看支持的格式。等于ffmpeg -muxers和ffmpeg -demuxers。
1 | $ ffmpeg -formats |
如需要查看某一种demuxer或muxer类型,可使用如下命令:
1 | $ ffmpeg -h muxer=flv |
可以使用ffmpeg -codecs来查看支持的编解码器。等于ffmpeg -encoders和 ffmpeg -decoders。
1 | $ ffmpeg -formats |
如需要查看某一种decoder或encoder类型,可使用如下命令:
1 | $ ffmpeg -h encoder=h264 |
ffprobe
查看多媒体数据包信息:
1 | $ ffprobe -show_packets xxx.mp4 |
分析多媒体的封装格式:
1 | $ ffprobe -show_format xxx.mp4 |
查看视频文件的帧信息:
1 | $ ffprobe -show_frames xxx.mp4 |
分析多媒体的流信息:
1 | $ ffprobe -of ini -show_steams xxx.mp4 |
ffprobe结果数据的格式可支持INI、XML、JSON、CSV、FLAT。
ffplay
ffplay是ffmpeg的一个子工具,它具有强大的音视频解码播放能力,目前它广泛被各种流行播放器(QQ影音、暴风影音等)集成应用。ffplay同样可以作为音视频数据的图形化分析工具。作为一款开源软件,ffplay囊括Linux、Windows、iOS、Android等众多主流系统平台,十分适合进行二次开发。
命令 | 说明 |
---|---|
x | 窗口宽度 |
y | 窗口高度 |
s | 视频宽高 |
fs | 强制全屏 |
an | 屏蔽音频 |
vn | 屏蔽视频 |
sn | 屏蔽字幕 |
ss | 根据秒数定位拖动 |
t | 设置播放视频/音频长度 |
autoexit | 播放完毕后自动退出ffplay |
stats | 输出多媒体播放状态 |
loop | 循环播放次数 |
codec | 强制使用设置的codec进行解码 |
acodec | 强制使用设置的音频解码器 |
vcodec | 强制使用设置的视频解码器 |
scodec | 强制使用设置的字幕解码器 |
ast | 设置将要播放的音频流(可能会有多个program的流) |
vst | 设置将要播放的视频流(可能会有多个program的流) |
sst | 设置将要播放的字幕流(可能会有多个program的流) |
vf | 视频滤镜设置,例如加载ASS或者SRT字幕文件 |
af | 音频滤镜设置 |
1 | $ ffplay http://127.0.0.1/live/test.m3u8 |
1 | $ ffplay -showmode 1 xxx.mp3 |