术语 | 全称 | 说明 |
---|---|---|
ffmpeg | Fast forword mpeg | 音视频转换器 |
ffplay | Fast forword play | 用ffmpeg实现的播放器 |
ffserver | Fast forword server | 用ffmpeg实现的rtsp服务器 |
ffprobe | Fast forword probe | 用来输入分析输入流 |
mux | 视频/音频封装 | |
demux | 解封装视频/音频 |
2. FFMPEG介绍与安装
2.1 FFmpeg简介
FFmpeg 是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用 LGPL 或 GPL 许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方 案。它包含了非常先进的音频/视频编解码库 libavcodec,为了保证高可移植性和编解 码质量,libavcodec 里很多 codec 都是从头开发的。
ffmpeg 项目由以下几部分组成:
- ffmpeg 视频文件转换命令行工具,也支持经过实时电视卡抓取和编码成视频文件.
- ffserver 基于 HTTP、RTSP 用于实时广播的多媒体服务器.也支持时间平移
- ffplay 用 SDL 和 FFmpeg 库开发的一个简单的媒体播放器
- libavcodec 一个包含了所有 FFmpeg 音视频编解码器的库.为了保证最优性能和 高可复用性,大多数编解码器从头开发的.
- libavformat 一个包含了所有的普通音视格式的解析器和产生器的库
2.2 FFmpeg安装
- yum(centos7)
# 1.升级系统
sudo yum install epel-release -y
# 2.安装Nux Dextop Yum 源 (centos7)
sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
# 3.安装FFmpeg 和 FFmpeg开发包
sudo yum install ffmpeg ffmpeg-devel -y
# 4.测试是否安装成功
ffmpeg
2.3 FFmpeg的基本组成
[插图]图1-1 FFmpeg基本组成模块FFmpeg框架的基本组成包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtil等模块库,结构如图1-1所示。
- FFmpeg的封装模块AVFormat
AVFormat中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装,如MP4、FLV、KV、TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。
- FFmpeg的编解码模块AVCodec
AVCodec中实现了目前多媒体领域绝大多数常用的编解码格式,既支持编码,也支持解码。AVCodec除了支持MPEG4、AAC、MJPEG等自带的媒体编解码格式之外,还支持第三方的编解码器,如H.264(AVC)编码,需要使用x264编码器;H.265(HEVC)编码,需要使用x265编码器;MP3(mp3lame)编码,需要使用libmp3lame编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在AVCodec中增加相应的编解码模块,关于AVCode的更多相关信息以及使用信息将会在后面的章节中进行详细的介绍。
- FFmpeg的滤镜模块AVFilter
AVFilter库提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和多个输出。
- FFmpeg的视频图像转换计算模块swscale
swscale模块提供了高级别的图像转换API,例如它允许进行图像缩放和像素格式转换,常见于将图像从1080p转换成720p或者480p等的缩放,或者将图像数据从YUV420P转换成YUYV,或者YUV转RGB等图像格式转换。
- FFmpeg的音频转换计算模块swresample
swresample模块提供了高级别的音频重采样API。例如它允许操作音频采样、音频通道布局转换与布局调整。
2.4 ffmpeg命令查看帮助文档
ffmpeg -h # 基本信息
ffmpeg -h long # 高级信息
ffmpeg -h fult # 所有信息
2.5 ffmpeg 音视频处理流程
ffmpeg工具的主要用途为编码、解码、转码以及媒体格式转换,ffmpeg常用于进行转码操作,使用ffmpeg转码的主要原理如图所示。
ffmpeg 主要工作流程相对比较简单,具体如下:
- 解封装(Demuxing)
- 解码(Decoding)
- 帧处理 (filter)
- 编码(Encoding)
- 封装(Muxing)
3. FFmpeg参数说明
3.1 通用选项
-L 展示许可证
-h, -?, -help, --help [arg] 帮助
-fromats 显示可用的格式(包括设备),编解码的,协议的。
-version 展示版本
-demuxers 展示可封装的格式
-muxers 展示可解封装的格式
-devices 展示可用的设备
-codecs 显示libavcodec已知的所有编解码器。
-decoders 显示可用的解码器。
-encoders 显示所有可用的编码器。
-bsfs 显示所有可用的比特流滤波器
-protocols 显示可用的协议。
-filters 显示可用的libavfilter过滤器(查看ffmpeg支持哪些滤镜)。
-pix_fmts 显示可用的像素格式。
-sample_fmts
-layouts 显示频道名称和标准频道布局。
-dispositions 显示流的disposition
-colors 显示识别的颜色名称
-sources device[,opt1=val1[,opt2=val2]...]
显示输入设备的自动检测源。一些设备可能提供无法自动检测的系统依赖的源名称。不能假设返回的列表总是完整的。
3.2 视频选项
-b bitrate 设置比特率,缺省 200kb/s
-r fps 设置帧频 缺省 25
-s size 设置帧大小 格式为 WXH 缺省 160X128.下面的简写也可以直接使用:
Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777
-croptop size 设置顶部切除带大小 像素单位
-cropbottom size –cropleft size –cropright size 底部,左边,右边切除带大小。
-padtop size 设置顶部补齐的大小 像素单位
-padbottom size –padleft size –padright size –padcolor color 设置补齐条大小和颜
色(hex,6 个 16 进制的数,红:绿:兰排列,比如 000000 代表黑色)
-vn 不做视频记录
-bt tolerance 设置视频码率容忍度 kbit/s
-maxrate bitrate 设置最大视频码率容忍度
-minrate bitreate 设置最小视频码率容忍度
-bufsize size 设置码率控制缓冲区大小
-vcodec codec 强制使用 codec 编解码方式。 如果用 copy 表示原始编解码数据必须
被拷贝。
-sameq 使用同样视频质量作为源(VBR)
-pass n 选择处理遍数(1 或者 2)。两遍编码非常有用。第一遍生成统计信息,第
二遍生成精确的请求的码率
-passlogfile file 选择两遍的纪录文件名为 file
3.3 ffmpeg的封装转换参数
ffmpeg转封装功能包含在AVFormat模块中,通过libavformat库进行Mux和Demux操作;多媒体文件的格式有很多种,这些格式的很多参数在Mux和Demux的操作参数中是公用的。源文档
参数 | 类型 | 释义 |
---|---|---|
-avioflags | 标记 | format的缓冲设置,默认为0,就是有缓冲 |
direct | 无缓冲状态 | |
-probesize | 整数 | 在进行媒体数据处理前获得文件内容的大小,可用在预读取文件头时提高速度,也可以设置设置足够大的值来读取到足够多的音视频数据信息 |
-formatprobesize | 整数 | 文件格式的字节数 (0~ 2.14748e+09) (default 1048576) |
-fflags | 标记 | |
flush_packets | 立即将packets数据刷新写入文件中 | |
ignidx | 忽略index | |
genpts | 输出时按照正常规则产生pts | |
nofillin | 不填写可以精确计算缺失的值 | |
igndts | 忽略dts | |
discardcorrupt | 丢失损坏的帧 | |
sortdts | 尝试以dts的顺序为准输出 | |
fastseek | 快速seek(定位)操作,但不够精确 | |
nobuffer | 直接读取或写出,不存入buffer,用于在直播采集时降低延迟 | |
bitexact | 不写入随机或不稳定的数据 | |
-seek2any | BOOL | 支持时,允许在解复用器级别查找非关键帧 (default false) |
-analyzeduration | 整数 | 指定解析媒体所需要花销的时间,这里设置值越高,解析越准确,如果在直播中为了降低延迟,这个值可以设置得更低些(0 ~ I64_MAX) (default 0) |
-output_ts_offset | 整数 | 设置输出文件的起始时间 |
-codec_whitelist | 列表 | 设置可以解析的codec的白名单 |
-format_whitelist | 列表 | 设置可以解析的format的白名单 |
3.4 ffmpeg的转码参数
参数 | 类型 | 释义 |
---|---|---|
b | 整数 | 设置音频与视频码率,可以认为是音视频加起来的码率,默认为200kbit/s,使用这个参数可以根据b:v设置视频码率,b:a设置音频码率 |
ab | 整数 | 设置音频的码率,默认是128kbit/s |
4. ffmpeg图片格式转换
1.jpg 转 I420
ffmpeg -i 001.jpg -s 510x510 -pix_fmt yuv420p 001_I420_fromJPG.yuv
- png 转 I420
ffmpeg -i 222.png -s 510x510 -pix_fmt yuv420p 222_I420_fromPNG.yuv
- bmp 转 I420
ffmpeg -i xxx.bmp -s 510x510 -pix_fmt yuv420p xxx_I420_fromBMP.yuv
- jpg 转 NV21
ffmpeg -i 001.jpg -s 510x510 -pix_fmt nv21 001_NV21_fromJPG.yuv
- jpg 转 NV12
ffmpeg -i 001.jpg -s 510x510 -pix_fmt nv12 001_NV12_fromJPG.yuv
- jpg 转 YUYV
ffmpeg -i 001.jpg -s 510x510 -pix_fmt yuyv422 001_YUYV_fromJPG.yuv
- jpg 转 RGB24
ffmpeg -i 001.jpg -s 510x510 -pix_fmt rgb24 001_RGB24_fromJPG.RGB
- jpg 转 BGR24
ffmpeg -i 001.jpg -s 510x510 -pix_fmt bgr24 001_BGR24_fromJPG.BGR
- jpg 转 GRAY
ffmpeg -i 001.jpg -s 510x510 -pix_fmt gray 001_GRAY_fromJPG.GRAY
5. FFmpeg转封装
5.1 音视频文件转MP4格式
5.1.1 MP4在FFmpeg中的Demuxer
ffmpeg -h demuxer=mp4
Demuxer mov,mp4,m4a,3gp,3g2,mj2 [QuickTime / MOV]:
Common extensions: mov,mp4,m4a,3gp,3g2,mj2.
5.1.2 MP4在FFmpeg中的Muxer
- faststart参数使用案例
# faststart将moov容器移动至mdat的前面
ffmpeg -i input.flv -c copy -f mp4 output.mp4
FFmpeg h.264
ffmpeg -i 1.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 1.264
FFmpeg操作USB摄像头
- 查看USB摄像头列表
ffmpeg -list_devices true -f dshow -i dummy
- 用ffplay打开USB摄像头
ffplay -f dshow -i video="USB Video Class MJPG"
- 指定分辨率播放
ffplay -s 320x240 -f dshow -i video="USB Camera"
- 指定编码格式
ffplay -vcodec mjpeg -f dshow -i video="USB Camera"
- 用指定大小的窗口播放
ffplay -x 300 -y 200 -f dshow -i video="USB Video Class MJPG"
- 设置播放窗口名称
ffplay -window_title "播放测试" -f dshow -i video="USB Camera"
- 查看摄像机支持的分辨率格式
ffmpeg -list_options true -f dshow -i video="USB Video Class MJPG"
- H.264编码保存为本地文件
ffmpeg -f dshow -i video="USB Camera" -vcodec libx264 myUsbcameraRecord.mkv
FFmpeg拉取RTSP流并保存视频
# 将流转换为 mp4
ffmpeg -i "rtsp://localhost:8554/mystream" -vcodec copy -t 20 -f mp4 test.mp4
# 将流转换为 mp4, 并按照2分钟就分割成多个文件 -r 设定帧速率, 一分钟分割, -segment_time 120, 两分钟 120s
ffmpeg -i "rtsp://192.168.100.30:554/live/test" -r 1/60 -c copy -map 0 -f segment -segment_time 120 -segment_format mp4 "./out%03d.mp4"