音视频与直播

万人直播架构

直播产品种类

  1. 泛娱乐化直播
  2. 实时互动直播

泛娱乐化直播架构

音视频与直播_时域

实时互动直播架构

音视频与直播_数据_02

CDN网络

CDN网络为了解决用户访问网络资源慢而出现的。

为什么访问慢:

  1. 访问链路长,比如从中国北部到南部
  2. 人为因素,运营商切割,电信用电信,联通用联通

CDN构成

边缘节点:用户从边缘节点上获取数据,让用户访问链路变短

二级节点:主干网节点,主要用于缓存,减轻源站压力

源站:CP(内容供应方)将内容放到源站

CDN网络架构

音视频与直播_码流_03

搭建直播系统

常用工具

  1. ffmpeg
  2. webrtc
  3. ffplay:播放器
  4. flashplayer:播放rtmp

搭建流媒体服务

  1. 准备流媒体服务器
  2. 编译并安装 Nginx 服务
  3. 配置 RTMP 服务并启动 Nginx 服务

音频

声音三要素

  1. 音调:就是音频,男生 < 女生 < 儿童
  2. 音量:振动的幅度
  3. 音色:与材质有很大的关系,本质是谐波

音量与音调

音视频与直播_音视频_04

音色(音品)

音视频与直播_数据_05

心里声学原理

人类听觉范围

音视频与直播_参考帧_06

音频压缩可以只留下可听声波数据

听觉/发生范围

音视频与直播_码流_07

人的正常说话,蝙蝠听不到。

音频量化与编码

音频量化过程

音视频与直播_参考帧_08

量化基本概念:

采样大小:一个采样用多少个bit存放,常用的是16bit

采样率:采样频率8k、16K、32K、44.1K、48K

声道数:单声道、双声道、多声道

码率计算

一个PCM音频流的码率:采样率 * 采样大小 * 声道数

例如:

采样率为44.1KHz,采样大小为16bit,双声道的 PCM 编码的WAV文件,

码率是:44.1K * 16 * 2 = 1411.2Kb/s

音频压缩

两种方法:

  1. 消除冗余数据(有损)
  2. 哈夫曼无损编码

音频冗余信息

压缩的主要方法是去除采集到的音频冗余信息,所谓冗余信息包括人耳听觉

范围外的音频信号,以及被掩蔽掉的音频信号

信号的掩蔽可以分为​​频域掩蔽​​和​​时域掩蔽​

频域掩蔽效应

音视频与直播_参考帧_09

时域掩蔽效应

音视频与直播_参考帧_10

音频编码过程

音视频与直播_码流_11

音频编解码器

常见的音频编解码器

  1. OPUS
  2. AAC
  3. Vorbis
  4. Speex:支持回音消除
  5. iLBC
  6. AMR
  7. G.711

RTMP不支持OPUS,但是支持AAC。

网上评测结果:OPUS > AAC > Vorbis

音频编码器性能对比

音视频与直播_码流_12

音频编码器选择

泛娱乐化直播选择AAC

实时互动直播选择OPUS

泛娱乐化和实时互动融合,则需要AAC和OPUS互转

实时互动和电话系统互联,则用到G.711、G.722

AAC(Advanced Audio Coding)

AAC的目的就是取代MP3格式。

MPEG-4标准出现后,AAC加入了SBR技术和PS技术

AAC优势

  1. 直播系统90%以上都使用AAC
  2. RTMP不支持OPUS,支持AAC
  3. AAC编解码质量非常高,可以做到音频高保真

AAC 规格

目前常用的规格有:AAC LC、AAC HE V1、AAC HE V2

音视频与直播_参考帧_13

  1. AAC LC(Low Complexity):低复杂度,码流128k
  2. AAC HE:AAC LC + SBR (Spectral Band Replication),码流64K
  3. AAC HE V2:AAC LC + SBR + PS(Parametric Stereo),码流32K

AAC格式

ADIF(Audio Data Interchange Format):这种格式只能从头开始解码,常用在磁盘文件中

ADTS(Audio Data Transport Stream):这种格式每一帧都有一个同步字(头),可以在音频流任何位置开始解码,它类似于数据流格式

AAC编码库

libfdk_AAC > ffmepg AAC > libfaac > libvo_aacenc

视频

H264基本概念

I帧:关键帧,采用帧内压缩技术

P帧:向前参考帧,压缩时只参考前一个帧,属于帧间压缩技术

B帧:双向参考帧,压缩时既参考前一帧,也参考后一帧,帧间压缩技术

GOF(Group of Frame)

GOF一组帧,一个I帧到另一个I帧之间的所有帧,成为一组,即GOF。

GOF(Group of Frame) == GOP (Group of Picture)

SPS 与 PPS

SPS(Sequence Parameter Set),序列参数集合,存放帧数,参考帧数目,解码图像尺寸,帧场编码模式选择标识等

PPS(Picture Parameter Set),图像参数集,存放熵编码模式选择标识,片组数目,初始量化参数和去方块滤波系数调整标识等

视频花屏/卡顿原因

如果 GOP 分组中的P帧丢失会造成解码端的图像发生错误

为了避免花屏问题的发生,一般如果发现P帧或者I帧丢失,就不显示本GOP内的所有帧,直到下一个I帧来后重新刷新图像

花屏是因为丢帧,卡顿是为了避免丢帧而造成的花屏,理论上二选一。

视频编解码器

  1. x264 / x265:软编基本都会选择这个
  2. openH264:支持视频分层(SVC)
  3. vp8 / vp9

H264编码原理

H264压缩技术

  1. 帧内预测压缩,解决的是空域数据冗余问题
  2. 帧间预测压缩,解决的是时域数据冗余问题
  3. 整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化
  4. CABAC压缩

宏块划分与分组

音视频与直播_数据_14

划分后结果是:

音视频与直播_音视频_15

子块划分

音视频与直播_音视频_16

帧分组

音视频与直播_数据_17

视频压缩

帧间预测

组内宏块查找

音视频与直播_数据_18

运动估算

音视频与直播_参考帧_19

运动矢量与补偿压缩

音视频与直播_音视频_20

帧内预测

音视频与直播_时域_21

计算帧内预测残差值

音视频与直播_参考帧_22

预测模式与残差值压缩

音视频与直播_时域_23

DCT压缩

音视频与直播_数据_24

压缩后

音视频与直播_音视频_25

VLC压缩(无损压缩)

音视频与直播_音视频_26

CABAC 压缩

音视频与直播_数据_27

H264

H264结构图

音视频与直播_音视频_28

H264编码分层

分成两层:

  1. NAL层,Network Abstraction Layer,视频数据网络抽象层
  2. VCL层,Video Coding Layer,视频数据编码层。压缩数据

码流基本概念

SODB:String Of Data Bits,原始数据比特流,长度不一定是8的倍数,它是由VCL层产生的

RBSP:Raw Byte Sequence Payload,SODB + trailing bits,算法是在SODB最后一位补1,不按字节对齐则补0

EBSP:Encapsulate Byte Sequence Payload,需到两个连续的0x00就增加一个0x03

NUAL:NAL Header(1B) + EBSP

NAL Unit

音视频与直播_音视频_29

切片(Slice)与宏块(MacroBlock)

音视频与直播_参考帧_30

H264切片

音视频与直播_音视频_31

H264码流分层

音视频与直播_码流_32

NALU

NAL Header

音视频与直播_码流_33

F:forbidden_zero_bit,在H.264规范中规定了这一位必须为0

NRI:指示重要性,暂无用

Type:这个NALU单元的类型

音视频与直播_音视频_34

音视频与直播_码流_35

NAL类型介绍

  1. 单一类型:一个RTP只包含一个NALU
  2. 组合类型:一个RTP包含多个NALU,类型是24-27
  3. 分片类型:一个NALU单元分成多个RTP包,类型是28和29
单一NALU的RTP包

音视频与直播_参考帧_36

组合NALU的RTP包

音视频与直播_数据_37

分片NALU的RTP包

音视频与直播_码流_38

FU Header

音视频与直播_数据_39

S:start bit,用于指明分片的开始

E:end bit,用于指明分片的结束

R:未使用,设置为0

Type:指明分片NAL类型

RGB

红、绿、蓝,每一种一个字节,总共24bit

YUV

也称YCbCr,是电视系统所采用的一种颜色编码方法

Y 表示明亮度,也就是灰阶度,它是基础信号

U 和 V 表示的则是色度,UV 的作用是描述影像色彩及饱和度,他们用于指定像素的颜色

YUV常见格式

  1. YUV4:2:0(YCbCr 4:2:0)
  2. YUV4:2:2(YCbCr 4:2:2)
  3. YUV4:4:4(YCbCr 4:4:4)
    YUV的使用还是为了节省空间

YUV4:2:0

YUV4:2:0并不意味着只有Y,Cb两个分量,而没有Cr分量。它实际指的是对每一行扫描线来说,只有一种色度分量,它以2:1的抽样率存储

相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0...,以此类推

YUV存储格式

planar(平面)

I420:YYYYYYYY UU VV => YUV420P

YV12:YYYYYYYY YY UU => YUV420P

packed(打包)

NV12:YYYYYYYY UVUV => YUV420SP

NV21:YYYYYYYY VUVU => YUV420SP

音视频技术栈

音视频知识

  1. 音视频采集
  2. 音视频硬件编/解码
  3. FFMPEG
  4. 视频渲染与OpenGL
  5. x264优化
  6. 交叉编译与优化
  7. WebRTC
  8. 音视频处理架构
  9. 网络传输
  10. 解码
  11. 渲染

行业痛点

  1. 视频秒开
  2. 回音消除
  3. 音频降噪
  4. 视频出现花屏、卡顿、绿边
  5. 手机发烫
  6. 音视频同步