My Awesome Book
ffmpeg主要用于:
- decode(解码)
- encode(编码)
- transcode(转码)
- mux(复用)
- demux(解复用)
- stream
- filter
- play
ffmpeg库组成
- libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构 和读取音视频帧等功能;
- libavcodec:用于各种类型声音/图像编解码;
- libavutil:包含一些公共的工具函数;
- libswscale:用于视频场景比例缩放、色彩映射转换;
- libpostproc:用于后期效果处理;
- ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;
- ffsever:一个 HTTP 多媒体即时广播串流服务器;
- ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;
流媒体处理过程
media file--->demux(解复用)--->decode(解码)---->YUV/RGB数据
- demux(解复用):多媒体之所以称为多媒体是因为他是多种媒介数据的集合,最少会包含视频数据和音频数据,而在媒体数据进行传输的时候不可能分成两个文件,所以要将视频和音频数据进行合并,这个过程叫做dux(复用),那么在我们打算播放的时候就要进行解复用,为了分别得到视频和音频文件,为后边的解码做准备
- decode(解码):所谓的视频本质是RGB数据,大量的RGB数据,在数据进行存储和传输的时候就会遇到很大的挑战,因为这个数据太大了,所以我们需要压缩,这个压缩的过程叫做encode(编码),当我们使用这个文件的时候就要进行解压缩(decode),音频数据类似
上边这段话构成了ffmpeg的整体的大基础。
视频/音频数据封装
封装格式又叫做容器,是将音频数据和视频数据放在一起的一种手段。
视频编码数据
作用:将视频像素数据(RGB/YUV等)压缩为视频流码,从而降低视频数据量。
主流类型:
名称 | 推出机构 | 推出时间 | 领域 |
---|---|---|---|
HEVC(H.265) | MPEG/ITU-T | 2013 | 研发中 |
H.264 | MPEG/ITU-T | 2003 | 各个领域 |
MPEG4 | MPEG | 2001 | 不温不火 |
MPEG2 | MPEG | 1994 | 数字电视 |
VP9 | 2013 | 研发中 | |
VP8 | 2008 | 不普及 | |
VC-1 | 微软 | 2006 | 微软平台 |
其中我们主要研究H.264
I/P/B帧
视频压缩中,每帧代表一幅静止的图像。而在实际压缩时,会采取各种算法减少数据的容量,其中IPB就是最常见的。
简单地说,I帧是关键帧,属于帧内压缩。就是和AVI的压缩是一样的。 P是向前搜索的意思。B是双向搜索。他们都是基于I帧来压缩数据。
I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)
P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累~。
所以说,如果是一个不太动的画面,即使时间长,数据量不一定大。
音频编码数据
将采样数据(PCM)压缩为音频码流,从而降低数据量。
名称 | 推出机构 | 推出时间 | 领域 |
---|---|---|---|
AAC | MPEG/ITU-T | 1997 | 各个领域(新) |
AC-3 | Dobly | 1992 | 电影 |
MP3 | MPEG | 1993 | 各个领域(旧) |
WMA | 微软 | 1999 | 微软 |
AAC压缩方法现在是主流,可以将采样数据压缩10倍以上
视频像素数据
作用:保存了屏幕上所有像素点的像素值
常见的像素数据格式有RGB和YUV,压缩编码中一般使用YUV,最常见的是YUV420P。
一般情况下一小时的高清视频(25帧每秒)大小为 3600 25 1920 1080 2 = 559G
如果之大,简直不能忍啊。
音频采样数据
保存了音频中每个采样的点的值。所谓采样,就是模拟信号转换为数字信号的过程。
采样频率可以达到44100Hz,双声道数据会更大,采样精度会有16bit和32bit
术语总结
- 容器(Container)
容器就是一种文件格式,比如flv,mkv等。包含下面5种流以及文件头信息。
- 流(Stream)
是一种视频数据信息的传输方式,5种流:音频,视频,字幕,附件,数据。 流只是一种想象出来的名词,代表一连串通过时间来串连的数据元素
- 帧(Frame)
流中的数据元素被称作帧,帧代表一幅静止的图像,分为I帧,P帧,B帧。
- 包(packets)
从流中被读出来的数据叫做包,包是一段数据,它包含了可以被解码为方便我们最后在应用程序中操作的原始帧的数据。 包与帧的关系:用邮寄东西来类比,数据相当于货品,包是货品本身的包装,而帧是邮局给你的最外边的那层包装
- 编解码器(Codec)
是对视频进行压缩或者解压缩,CODEC =COde (编码) +DECode(解码)
- 复用/解复用(mux/demux)
把不同的流按照某种容器的规则放入容器,这种行为叫做复用(mux) 把不同的流从某种容器中解析出来,这种行为叫做解复用(demux)