音视频基础
一.视频处理流程
视频处理共包括七个过程,分别为:采样、编码、封装、传输、解析、解码、播放。
1.采样:包括音频采样与视频采样。音频采集后的数据为PCM数据,视频采集完的数据为YUV格式图像数据。
2.编码:对采样后的音频数据和视频数据进行压缩编码。音频数据压缩编码为ACC、WMA等格式。视频数据压缩编码为H.264、H.265等格式。
3.封装:将压缩编码后的音频数据和视频数据封装为MP4、AVI、FLV等封装格式。
4.传输:使用音视频传输协议如HTTP、RTMP等,对封装后的音视频数据进行传输。
5.解析:传输和封装的逆过程,包括协议解析和封装格式解析。协议解析是根据音视频协议从传输数据中获取封装的音视频数据。封装格式解析是将封装的音视频数据解析成编码压缩后的音频数据和视频数据。
6.解码:编码的逆过程,包括音频解码和视频解码。将压缩编码的音频数据还原为PCM数据,将压缩编码的视频数据还原为YUV格式图像数据。
7.播放:同步播放音频数据与视频数据。音视频同步一般以音频为基准,因为音频解码速度快。
二.视频编解码
1.FPS与BPS
FPS是帧率,即一秒钟播放多少帧。BPS是码率,即一秒钟传输数据量的大小,BPS受分辨率、帧率等多种因素影响,BPS的大小影响传输时的网络带宽。
2.I帧、P帧、B帧
在视频采样后会得到一帧一帧连续的YUV格式图像数据。这些帧图像数据会被分为三种类型:I帧、P帧、B帧。
- I帧:帧内编码帧,解码时可单独还原。
- P帧:前向预测编码帧,解码时需要通过前一个I帧或P帧还原,解码发生错误时会向后传递。
- B帧:双向预测内插编码帧,解码时需要通过前一个I帧或P帧与后一个P帧还原,解码发生错误时不会向后传递。
B帧越多,缓存越大,解码越复杂,实时性越低。P帧和B帧越多,编码效率越低,seek时间越长。I帧丢失会产生黑屏,P帧丢失会产生花屏。
3.IDR帧
IDR帧表示关键帧,是特殊标记的I帧,用于解码刷新与重同步。在解码过程中,当关键帧出现后,会清除参考帧缓存,关键帧之前的帧不可作为参考。
4.GOP
GOP是图像组,代表两个I帧之间的距离。GOP一般由M和N表示,M是I帧和P帧之间的距离,N是两个I帧之间的距离。如M=3,N=13对应的帧结构为IBBPBBPBBPBBI。
适当增大GOP可以提升图像质量。当帧率固定时,GOP越大,压缩率越低,平均每帧数据越大,图像质量越高。但GOP提升图像质量有限,H.264编码会在场景切换时强制插入一个I帧,使GOP变小。
5.DTS与PTS
DTS是解码时间戳,在编码时产生,标记帧解码的顺序。PTS是显示时间戳,在采样时产生,保证解码后的帧以何种顺序展示。当GOP中没有B帧时,解码顺序等于播放顺序,即PTS=DTS。
- 采样顺序:IBBPBBP
- 编码顺序:IPBBPBB
- 传输顺序:IPBBPBB
- 接收顺序:IPBBPBB
- 解码顺序:IPBBPBB
- 播放顺序:IBBPBBP
6.H.264
H.264是一种编码标准,在编码的过程中会对视频数据(I帧、P帧、B帧)进行压缩。包括帧内压缩与帧间压缩。
- 帧内压缩:空间压缩,针对I帧,图片压缩,有损压缩,压缩率不高。
- 帧间压缩:时间压缩,针对P帧和B帧,差值压缩,无损压缩,压缩率高。
6.1 压缩过程
视频帧的压缩过程分成四个阶段,分别为分组、定义帧、预测帧、数据传输。
- 分组:将视频帧分成多组GOP。
- 定义帧:区分每组GOP中的I帧、P帧、B帧。
- 预测帧:以I帧为基础帧,预测P帧,再通过I帧和P帧预测B帧。
- 数据传输:将I帧数据与还原P帧与B帧需要的差值数据进行存储传输。
三.颜色编码格式
颜色编码格式大类上包括YUV和RGB两种。RGB通过红、绿、蓝描述一个颜色。YUV使用亮度、蓝色与亮度差值、红色与亮度差值描述一个颜色。
采样到传输再到播放过程中使用YUV格式,最终渲染时使用RGB格式。
四.MP4与DASH
1.MP4
MP4是一种音视频媒体格式,用于对编码后的音频数据与视频数据封装,指导播放器如何解析音频数据与视频数据。
1.1 MP4文件格式
MP4文件由不同的Box(容器)组成,每个Box有不同的含义,Box与Box之间可以嵌套。一般情况下,MP4常用Box格式如下:
- ftpy:mp4文件描述信息。
- moov:媒体元数据。
- mvhd:文件整体信息。
- trak:音视频轨道。
- tkhd:轨道信息。
- mdia:音视频流。
- hdlr:轨道类型。
- mdhd:音视频流信息。
- stbl:mdat中的媒体数据索引。
- mdat:存放的媒体数据。
1.2 媒体数据格式
mdat的数据结构从大到小依次为Track、Chunk、Sample。
- Track:音视频序列。
- Chunk:多个Sample组成的mdat存储单元。
- Sample:帧数据或PCM数据。
1.3 MP4的分类
MP4可以分为普通MP4、快速MP4、FMP4三种,对应的格式如下:
- 普通MP4:ftpy mdat moov
- 快速MP4:ftpy moov mdat
- FMP4:ftpy moov moof mdat moof mdat …
由于moov需要在视频采样完成后才能确定,MP4视频越长,moov越大。同时在moov解析完成前,视频无法解码播放。因此在普通MP4中,需要下载完整个MP4文件才可以解码播放,当视频过大时,会造成起播时间增加。
快速MP4在普通MP4的基础上,在视频采样完成后将moov移动到mdat前。
FMP4是分片的MP4,用于直播视频流。FMP4将mdat分割成了更小片段的mdat,每个片段都有对应的媒体元数据moof。
2.DASH
DASH是一种基于HTTP的动态自适应视频流传输技术。
2.1 DASH协议
DASH协议是预先在服务端存储多种不同质量的MP4文件,并对这些MP4文件切分成小的片段,实现播放过程中视频的动态切换。
DASH协议由MPD、Period、AdaptionSet、Representation四部分组成。
- MPD:媒体描述文件,由不同时间区间的Period组成。
- Period:指定时间区间内资源的集合,由一个或者多个AdaptionSet组成的集合。
- AdaptionSet:自适应子集,由不同码率的Representation组成的集合。
- Representation:码流,代表一路音频流或视频流,由音视频资源分片组成的集合。
2.2 Dash分片形式
- SegmentBase:每个Representation只有一个媒体分片,根据索引范围请求FMP4文件。
- SegmentList:每个Representation包含多个媒体分片,MP4头信息单独请求。
- SegmentTemplate:快速生成SegmentList。
- SegmentTimeline:多分片扩展,消除分片不准的问题。
3.对比
3.1 DASH的特点
- 对视频进行切片,按切片播放,缓存小起播快。
- 自动码率切换、音视频资源分离、多分片流量可控。
- 拖动时间轴到任意时间播放时,可以快速定位到对应的切片进行播放,响应快。
- 具有一定的接入成本、预加载额外请求MDP、网络请求变多、运营商劫持。
3.2 MP4的特点
- 头文件较大,边下载边缓存,起播相对HLS和DASH慢。
- 拖动时间轴播放时,需要一定的时间缓存。
- 市场上大多数的浏览器客户端均能够播放,播放成功率高。