这是我参与「第四届青训营 」笔记创作活动的第10天
探索多媒体直播技术
视频的基本元素
-
比特率/码率:单位时间内传送bit的数目,单位为bps,也称码流
- 越高的比特率,需要越高的带宽来支撑,否则会带来卡顿、成本等问题
- 太低的比特率,会导致视频画面过度压缩,模糊不清
-
FFmpeg Tools
- ffmpeg:视频处理工具
- ffpaly:视频播放工具
- ffprobe:视频分析工具
-
帧:视频里的每一个画面
-
帧率(FPS):每秒的帧数
-
轨道/流:一个视频封装里面可以放多个音频轨道,视频流、音频流数据相互交错排列,形成混流
- 交错排列:一个位置的音视频数据相隔太远会导致卡顿、音画不同步
视频压缩:利用视频画面的相关性来减少数据量
-
颜色空间:YUV,就是另一种颜色数字化表达方式,RGB信号不利于压缩,视频储存中,将更多的带宽留给亮度信息(黑白信号),将少量的带宽留给色度(彩色信号)
-
帧内压缩(空间压缩):将像素用旁边相似的像素代替
-
帧间压缩(时间压缩):画面内静止的区域不记录,只记录画面变化的部分
-
帧的编码类型:
- I-frame:帧内帧
- P-frame:前向预测帧
- B-frame:b帧可以参考和插入再他之前和之后发生的两个帧,即可降低帧数大小,同时保存视频质量
-
GOP(Group of Pictures)
- 视频点播:节省带宽,高压缩率,会使用B帧
- 直播:低延迟,不使用B帧
- 视频编辑:提高响应,个别会使用全I帧
-
视频编码格式(压缩比越高的编码算法需要越高的算力来支撑)
- H264:AVC 广泛普及
- H265:HEVC 逐渐普及
- H266:VVC 未普及
-
视频封装(视频格式):将编码压缩好的视频轨道和音频轨道按照一定格式放到一个文件中,也叫视频容器
- MP4:按照一定规则将音视频数据结构化的放到一个文件中
- FLV:由文件头和很多tag组成,tag由音频流、视频流、脚本流组成
直播推拉流协议
-
CDN(Content Delivery Network)
- 由很多个节点一级一级分发,通过ip地址找到最近的CDN节点,减少起播的耗时
- 由很多个节点一级一级分发,通过ip地址找到最近的CDN节点,减少起播的耗时
-
专业名词
- 点播:视频播放
- 直播看播:观众观看直播
- 推流:主播将数据发送到CDN网络
- 拉流:观众从CDN拉取直播数据
-
推拉流协议方案
- 推流协议:RTMP(实时消息协议)
- 优势:基于tcp协议,不用考虑丢包;技术成熟,ffmpeg项目中由RTMP库;低延迟
- 劣势:以停止更新;不支持H265;使用1935端口,可能被防火墙拦截;苹果不支持
- 拉流协议:
- HTTP-FLV
- 优势:协议友好,格式简单,便于分发;不准啊吗情况下就可以直接转发,延迟低
- HLS(HTTP Live Streaming)
- 苹果自己的协议
- 原理:把整个流分成一个个小的基于HTTP文件来下载,每次只下载一些
- 视频封装格式:m3u8 / ts
- HTTP-FLV
- 推流协议:RTMP(实时消息协议)
-
开播过程
- 图像采集(摄像头、录屏、图像采集卡)
- 图像处理(看需处理)
- 编码 + 封装
- 推流
-
看播过程
- 拉流(HLS、HTTP-FLV)
- 解封装+解码(硬件解码、软件解码)
- 图像处理(看需处理)
- 渲染(OpenGL、VULKAN、Native window)
-
音画同步
- 解码视频音频后放入内存
- 播放时将视频帧向音频对齐