直播平台技术原理浅析——听课笔记
课程地址:https://www.bilibili.com/video/BV1dv411C7vx?share_source=copy_web
直播相关基础知识
RGB格式:
每一个数据单元直接表示RGB三原色,用各原色其所占位数表示。
常用的有:
RGB888(24位色)
RGB565(16位色) 因为要是8的倍数故排成16位,多留出以为留给绿色通道,因为人眼对绿色光波最敏感。
为什么需要对原始采样做编码(为什么视频需要编解码):
不考虑音频的情况下,一段一小时1080p的纯视频未编码的原始数据(RGB888)的大小为: 500G
***编码就是未了缩小原始数据的大小
视频冗余
冗余信息类型 | 冗余信息类型 |
---|---|
空间冗余 | 图像相邻像素之间有较强的相关性 |
时间冗余 | 视频序列的相邻图像之间内容相似 |
编码冗余 | 不同编码值出现概率不同 |
视觉冗余 | 人的视觉系统对某些细节不敏感 |
知识冗余 | 规律性的结构可由先验知识和背景知识到 |
结构冗余 | 某些图片存在的分布模式 |
视频帧的类型
-
I帧:是自带全部信息的独立帧,是最完整的画面(全帧JPEG压缩编码),无需参考其他图像便可独立进行解码。视频序列的第一帧,始终都是I帧。
量化
通过用更粗糙的数据表示精细的数据来降低编码的数据量,或者通过去除人眼敏感的信息来降低编码的数据量
编码过程:
-
每一帧原始采样分块
-
图片分组
有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值只有1%以内。
一组成为一个GOP(group of pictures)(包括一份I帧和多分P/B帧)
-
逐帧编码
封装格式(一块索引信息加上了许多文件块)
将数据流按照一定格式封装传输
网络传输协议
RTMP | HTTP-FLV | HLS | DASH | |
---|---|---|---|---|
传输方式 | TCP流 | HTTP流(基于HTTP的RTMP) | HTTP | HTTP |
视频封装格式 | FLV | FLV TAG | MPEG2-TS | MP4,3GP,WEBM |
原理 | 数据收到后立即转发 | 同RTMP | 集合一段时间的数据,生成切片文件并且更新m3u8索引文件 | 生成不同类型的切片,根据分辨率自动适配 |
数据分段 | 连续流 | 连续流 | 切片文件 | 切片文件 |
WEB支持 | 非原生支持 | 可以通过flv.js解包播放 | 可以通过flv.js解包播放 | 如果dash文件列表是mp4 webm文件就直接播放 |
其他 | 跨平台支持性差 | 不支持多音频流多视频流,不便于seek,IOS不支持 | 播放是需要多次请求,网络要求高 | 不普及 |
如何搭建一套直播系统
客户端推流处理过程
- 软编码:使用CPU进行编码,通过软件代码来实现音视频编解码算法,如FFMpeg,GPUImage等。
- 硬编码使用非CPU的硬件芯片或电路实现编码算法,通过调用编解码芯片提供的API来实现。如安卓的MediaCodec。
- 现在的智能手机的“芯片”从严格意义上说其实已经不是单纯一个CPU,而是SoC(System on a chip),它由CPU、GPU、DSP等芯片继承在一起。
服务端流处理过程
基础流媒体服务器主要包含几个功能:信令处理、视频流处理(转码/转封装/接&拉流)、视频文件储存。
流媒体服务器有大量成熟的解决方案(开源、商用化):如SRS、NGINX、CRTMPD、AMS、WOWZA等
基础流媒体服务器主要包含几个功能:信令处理、视频流处理(转码/转封装/接&拉流)、视频文件储存。
流媒体服务器有大量成熟的解决方案(开源、商用化):如SRS、NGINX、CRTMPD、AMS、WOWZA等