音视频与直播

万人直播架构

直播产品种类

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

泛娱乐化直播架构

实时互动直播架构

CDN网络

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

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

CDN构成

边缘节点:用户从边缘节点上获取数据,让用户访问链路变短
二级节点:主干网节点,主要用于缓存,减轻源站压力
源站:CP(内容供应方)将内容放到源站

CDN网络架构

搭建直播系统

常用工具

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

搭建流媒体服务

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

音频

声音三要素

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

音量与音调

音色(音品)

心里声学原理

人类听觉范围

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

听觉/发生范围

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

音频量化与编码

音频量化过程

量化基本概念:
采样大小:一个采样用多少个bit存放,常用的是16bit
采样率:采样频率8k、16K、32K、44.1K、48K
声道数:单声道、双声道、多声道

码率计算

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

例如:
采样率为44.1KHz,采样大小为16bit,双声道的 PCM 编码的WAV文件,
码率是:44.1K * 16 * 2 = 1411.2Kb/s

音频压缩

两种方法:

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

音频冗余信息

压缩的主要方法是去除采集到的音频冗余信息,所谓冗余信息包括人耳听觉
范围外的音频信号,以及被掩蔽掉的音频信号

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

频域掩蔽效应

时域掩蔽效应

音频编码过程

音频编解码器

常见的音频编解码器

  1. OPUS
  2. AAC
  3. Vorbis
  4. Speex:支持回音消除
  5. iLBC
  6. AMR
  7. 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优势

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

AAC 规格

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

  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压缩

宏块划分与分组


划分后结果是:

子块划分

帧分组

视频压缩

帧间预测

组内宏块查找

运动估算

运动矢量与补偿压缩

帧内预测

计算帧内预测残差值

预测模式与残差值压缩

DCT压缩

压缩后

VLC压缩(无损压缩)

CABAC 压缩

H264

H264结构图

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

切片(Slice)与宏块(MacroBlock)

H264切片

H264码流分层

NALU

NAL Header


F:forbidden_zero_bit,在H.264规范中规定了这一位必须为0
NRI:指示重要性,暂无用
Type:这个NALU单元的类型

NAL类型介绍

  1. 单一类型:一个RTP只包含一个NALU
  2. 组合类型:一个RTP包含多个NALU,类型是24-27
  3. 分片类型:一个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常见格式

  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. 音视频同步
 
 转自:https://www.cnblogs.com/minbo/p/yin-shi-pin.html