- 泛娱乐:可以b帧
- 实时互动,不能使用b帧,因为解码当前帧需要后面帧传输过来,如果网络不好,传输不过来,就卡顿了。
- 解码一组帧之前,是先收到sps和pps,否则无法解码。一组GOF,一个关键帧。
- 花屏是因为丢帧,导致p帧或b帧不能参考其他帧解码。
- 卡顿:为了避免花屏,就丢一组GOP数据。这样就导致了卡顿。
- x264使用最广泛,使用软编。
- x265逐渐成熟,压缩比高,但cpu容易占满,不适合直播。
- openH264较次于x264。支持svc技术,视频分层传输,一帧分为小中大,根据网络情况而定。每传输一层,就加一层,就清晰一些。很多硬件不支持svc。所以需要软编,导致消耗cpu,手机费电、发烫。
- vp8/vp9,对应x264/x265,Google推出。
- 空域数据:宽高这幅图,不明显的颜色值,可以去掉。
- 一组数据:连续几幅画面,对于静止画面,删除重复数据。
- 第三个不明白
- 无损压缩,类似霍夫曼编码
帧间压缩
← 对整幅图进行宏块划分的效果
根据实际图像,划分不同大小的宏块。
由于背景都相同,所以仅记录球的运动轨迹+一副背景图。减少数据量。
相邻图,找到宏块,就在下一幅图的周围找,所有图,进行两两比较,就能找到红色标注,连续的运动估算。
帧内压缩
上面的都是针对帧间压缩。上图针对的 I 帧,就是关键帧。9种模式。
预测+残差=原图(解码过程)
DCT压缩
先量化,然后用DCT技术压缩
VLC压缩,类似霍夫曼编码。频率高的码编成短码,频率低的使用长码。
CABAC:上下文适应的无损压缩。
从视频序列中,取1帧H264的编码数据,一帧H264图像数据,由多个片组成,每个片由多个宏块组成,每个宏块由多个字块组成。
- NAL层作用:H264在网络上传输,网络允许的最大传输单元为1500字节,但一帧往往大于1500字节,所以就需要把帧拆分多个包进行传输,所有拆包组包都是通过NAL层进行处理。
- VCL层作用:对视频原始数据进行压缩。
RBSP主要标识流的结束位。
- EBSP 区别于起始位:0x000001 0x00000001
H.264 的编码视频序列包括一系列的NAL 单元。在VCL 数据传输或存储之前,先被映射或封装进NAL 单元中。每个NAL 单元包括一个原始字节序列负荷(RBSP, Raw Byte Sequence Payload)、一组对应于视频编码的NAL 头信息。RBSP 的基本结构是:在原始编码数据的后面填加了结尾比特。一个bit“1”若干比特“0”,以便字节对齐。
RBSP结构如下:每个单元都按独立的NAL 单元传送。单元的信息头(一个字节)定义了RBSP 单元的类型,NAL 单元的其余部分为RBSP 数据。
H264码流的分层:
- Annexb 格式:0x0000001起始。
- Slice Data(切片数据里)包含多个宏块。
- 宏块里包含:宏块类型,宏块数据,宏块参数,残差数据等。
- 残差数据:残差块。
- RTP Packet分层同上,是从传输层面进行的分层。
1个H264帧包含1个或多个切片。
下图是切片和宏块的关系。
NALU单元详解
NALU单元的类型Type比较重要,主要有以下类型:
- type:5 IDR图像的片,关键帧。
- type:7 序列参数集,宽高
- type:8 图像参数集,帧内预测模式
- type:28 FU-A 分片的单元。一个包一个片,进行组装用的。
- type:29 FU_B 分片的单元。一个包一个片,进行组装用的。
Cb = U, Cr = V
I420 格式PC端常用。
采集,复杂在各个端,win/mac/。。。
硬编码/硬解码,硬件模块编解码
FFMPEG,软编软解,转封装格式,将各种音频格式抽取出来,水印,倍速播放。。。
视频渲染与openGL
x264优化(调节参数),编码。ffmpeg解码。
交叉编译与优化
webRTC ,很多特别的方法和API
音视频处理架构
网络传输
整理自慕课网——移动端音视频入门
H264参考这里:https://blog.csdn.net/qq_36449541/article/details/81485022