术语全称说明
ffmpegFast forword mpeg音视频转换器
ffplayFast forword play用ffmpeg实现的播放器
ffserverFast forword server用ffmpeg实现的rtsp服务器
ffprobeFast forword probe用来输入分析输入流
mux 视频/音频封装
demux 解封装视频/音频

2. FFMPEG介绍与安装

2.1 FFmpeg简介

FFmpeg 是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用 LGPL 或 GPL 许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方 案。它包含了非常先进的音频/视频编解码库 libavcodec,为了保证高可移植性和编解 码质量,libavcodec 里很多 codec 都是从头开发的。

ffmpeg 项目由以下几部分组成:

  1. ffmpeg 视频文件转换命令行工具,也支持经过实时电视卡抓取和编码成视频文件.
  2. ffserver 基于 HTTP、RTSP 用于实时广播的多媒体服务器.也支持时间平移
  3. ffplay 用 SDL 和 FFmpeg 库开发的一个简单的媒体播放器
  4. libavcodec 一个包含了所有 FFmpeg 音视频编解码器的库.为了保证最优性能和 高可复用性,大多数编解码器从头开发的.
  5. 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所示。

image-20220404004050844

  1. FFmpeg的封装模块AVFormat

AVFormat中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装,如MP4、FLV、KV、TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。

  1. FFmpeg的编解码模块AVCodec

AVCodec中实现了目前多媒体领域绝大多数常用的编解码格式,既支持编码,也支持解码。AVCodec除了支持MPEG4、AAC、MJPEG等自带的媒体编解码格式之外,还支持第三方的编解码器,如H.264(AVC)编码,需要使用x264编码器;H.265(HEVC)编码,需要使用x265编码器;MP3(mp3lame)编码,需要使用libmp3lame编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在AVCodec中增加相应的编解码模块,关于AVCode的更多相关信息以及使用信息将会在后面的章节中进行详细的介绍。

  1. FFmpeg的滤镜模块AVFilter

AVFilter库提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和多个输出。

  1. FFmpeg的视频图像转换计算模块swscale

swscale模块提供了高级别的图像转换API,例如它允许进行图像缩放和像素格式转换,常见于将图像从1080p转换成720p或者480p等的缩放,或者将图像数据从YUV420P转换成YUYV,或者YUV转RGB等图像格式转换。

  1. FFmpeg的音频转换计算模块swresample

swresample模块提供了高级别的音频重采样API。例如它允许操作音频采样、音频通道布局转换与布局调整。

2.4 ffmpeg命令查看帮助文档

ffmpeg -h # 基本信息
ffmpeg -h long # 高级信息
ffmpeg -h fult # 所有信息

2.5 ffmpeg 音视频处理流程

ffmpeg工具的主要用途为编码、解码、转码以及媒体格式转换,ffmpeg常用于进行转码操作,使用ffmpeg转码的主要原理如图所示。

image-20220404002204833

ffmpeg 主要工作流程相对比较简单,具体如下:

  1. 解封装(Demuxing)
  2. 解码(Decoding)
  3. 帧处理 (filter)
  4. 编码(Encoding)
  5. 封装(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不写入随机或不稳定的数据
-seek2anyBOOL支持时,允许在解复用器级别查找非关键帧 (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
  1. png 转 I420
ffmpeg -i 222.png -s 510x510 -pix_fmt yuv420p 222_I420_fromPNG.yuv
  1. bmp 转 I420
ffmpeg -i xxx.bmp -s 510x510 -pix_fmt yuv420p xxx_I420_fromBMP.yuv
  1. jpg 转 NV21
ffmpeg -i 001.jpg -s 510x510 -pix_fmt nv21 001_NV21_fromJPG.yuv
  1. jpg 转 NV12
ffmpeg -i 001.jpg -s 510x510 -pix_fmt nv12 001_NV12_fromJPG.yuv
  1. jpg 转 YUYV
ffmpeg -i 001.jpg -s 510x510 -pix_fmt yuyv422 001_YUYV_fromJPG.yuv
  1. jpg 转 RGB24
ffmpeg -i 001.jpg -s 510x510 -pix_fmt rgb24 001_RGB24_fromJPG.RGB
  1. jpg 转 BGR24
ffmpeg -i 001.jpg -s 510x510 -pix_fmt bgr24 001_BGR24_fromJPG.BGR
  1. 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

img

  1. 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摄像头

  1. 查看USB摄像头列表
ffmpeg -list_devices true -f dshow -i dummy
  1. 用ffplay打开USB摄像头
ffplay -f dshow -i video="USB Video Class MJPG"
  1. 指定分辨率播放
ffplay -s 320x240  -f dshow -i video="USB Camera"
  1. 指定编码格式
ffplay -vcodec mjpeg  -f dshow -i video="USB Camera"
  1. 用指定大小的窗口播放
ffplay -x 300 -y 200 -f dshow -i video="USB Video Class MJPG"
  1. 设置播放窗口名称
ffplay  -window_title "播放测试"  -f dshow -i video="USB Camera"
  1. 查看摄像机支持的分辨率格式
ffmpeg -list_options true -f dshow -i video="USB Video Class MJPG"
  1. 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"

参考文章


看见了
876 声望16 粉丝

前端开发,略懂后台;