万人直播架构
直播产品种类
- 泛娱乐化直播
- 实时互动直播
泛娱乐化直播架构
实时互动直播架构
CDN网络
CDN网络为了解决用户访问网络资源慢而出现的。
为什么访问慢:
- 访问链路长,比如从中国北部到南部
- 人为因素,运营商切割,电信用电信,联通用联通
CDN构成
边缘节点:用户从边缘节点上获取数据,让用户访问链路变短
二级节点:主干网节点,主要用于缓存,减轻源站压力
源站:CP(内容供应方)将内容放到源站
CDN网络架构
搭建直播系统
常用工具
- ffmpeg
- webrtc
- ffplay:播放器
- flashplayer:播放rtmp
搭建流媒体服务
- 准备流媒体服务器
- 编译并安装 Nginx 服务
- 配置 RTMP 服务并启动 Nginx 服务
音频
声音三要素
- 音调:就是音频,男生 < 女生 < 儿童
- 音量:振动的幅度
- 音色:与材质有很大的关系,本质是谐波
音量与音调
音色(音品)
心里声学原理
人类听觉范围
音频压缩可以只留下可听声波数据
听觉/发生范围
人的正常说话,蝙蝠听不到。
音频量化与编码
音频量化过程
量化基本概念:
采样大小:一个采样用多少个bit存放,常用的是16bit
采样率:采样频率8k、16K、32K、44.1K、48K
声道数:单声道、双声道、多声道
码率计算
一个PCM音频流的码率:采样率 * 采样大小 * 声道数
例如:
采样率为44.1KHz,采样大小为16bit,双声道的 PCM 编码的WAV文件,
码率是:44.1K * 16 * 2 = 1411.2Kb/s
音频压缩
两种方法:
- 消除冗余数据(有损)
- 哈夫曼无损编码
音频冗余信息
压缩的主要方法是去除采集到的音频冗余信息,所谓冗余信息包括人耳听觉
范围外的音频信号,以及被掩蔽掉的音频信号
信号的掩蔽可以分为频域掩蔽
和时域掩蔽
频域掩蔽效应
时域掩蔽效应
音频编码过程
音频编解码器
常见的音频编解码器
- OPUS
- AAC
- Vorbis
- Speex:支持回音消除
- iLBC
- AMR
- G.711
RTMP不支持OPUS,但是支持AAC。
网上评测结果:OPUS > AAC > Vorbis
音频编码器性能对比
音频编码器选择
泛娱乐化直播选择AAC
实时互动直播选择OPUS
泛娱乐化和实时互动融合,则需要AAC和OPUS互转
实时互动和电话系统互联,则用到G.711、G.722
AAC(Advanced Audio Coding)
AAC的目的就是取代MP3格式。
MPEG-4标准出现后,AAC加入了SBR技术和PS技术
AAC优势
- 直播系统90%以上都使用AAC
- RTMP不支持OPUS,支持AAC
- AAC编解码质量非常高,可以做到音频高保真
AAC 规格
目前常用的规格有:AAC LC、AAC HE V1、AAC HE V2
- AAC LC(Low Complexity):低复杂度,码流128k
- AAC HE:AAC LC + SBR (Spectral Band Replication),码流64K
- 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帧来后重新刷新图像
花屏是因为丢帧,卡顿是为了避免丢帧而造成的花屏,理论上二选一。
视频编解码器
- x264 / x265:软编基本都会选择这个
- openH264:支持视频分层(SVC)
- vp8 / vp9
H264编码原理
H264压缩技术
- 帧内预测压缩,解决的是空域数据冗余问题
- 帧间预测压缩,解决的是时域数据冗余问题
- 整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化
- CABAC压缩
宏块划分与分组
划分后结果是:
子块划分
帧分组
视频压缩
帧间预测
组内宏块查找
运动估算
运动矢量与补偿压缩
帧内预测
计算帧内预测残差值
预测模式与残差值压缩
DCT压缩
压缩后
VLC压缩(无损压缩)
CABAC 压缩
H264
H264结构图
H264编码分层
分成两层:
- NAL层,Network Abstraction Layer,视频数据网络抽象层
- 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
切片(Slice)与宏块(MacroBlock)
H264切片
H264码流分层
NALU
NAL Header
F:forbidden_zero_bit,在H.264规范中规定了这一位必须为0
NRI:指示重要性,暂无用
Type:这个NALU单元的类型
NAL类型介绍
- 单一类型:一个RTP只包含一个NALU
- 组合类型:一个RTP包含多个NALU,类型是24-27
- 分片类型:一个NALU单元分成多个RTP包,类型是28和29
单一NALU的RTP包
组合NALU的RTP包
分片NALU的RTP包
FU Header
S:start bit,用于指明分片的开始
E:end bit,用于指明分片的结束
R:未使用,设置为0
Type:指明分片NAL类型
RGB
红、绿、蓝,每一种一个字节,总共24bit
YUV
也称YCbCr,是电视系统所采用的一种颜色编码方法
Y 表示明亮度,也就是灰阶度,它是基础信号
U 和 V 表示的则是色度,UV 的作用是描述影像色彩及饱和度,他们用于指定像素的颜色
YUV常见格式
- YUV4:2:0(YCbCr 4:2:0)
- YUV4:2:2(YCbCr 4:2:2)
- 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
音视频技术栈
音视频知识
- 音视频采集
- 音视频硬件编/解码
- FFMPEG
- 视频渲染与OpenGL
- x264优化
- 交叉编译与优化
- WebRTC
- 音视频处理架构
- 网络传输
- 解码
- 渲染
行业痛点
- 视频秒开
- 回音消除
- 音频降噪
- 视频出现花屏、卡顿、绿边
- 手机发烫
- 音视频同步