这是我参与「第四届青训营 」笔记创作活动的第5天。
以下是第五堂课的笔记和总结
探究多媒体直播技术
视频基本元素
-
像素
一般使用RGB三原色表示,R、G、B分别从0~255,共256个等级。
-
分辨率
纵横方向的像素数量,一般用宽*高或长*宽表示,如720*1080、1920*1080。
-
码率/比特率
单位时间播放连续媒体如压缩后的音视频的bit数量,也称为码流,高码率需要更高的带宽支持,低码率可能会导致画面过度压缩,模糊不清。
-
帧率
每秒传输帧数,帧数越多,所显示动作就会越流畅,FPS可以理解为刷新率,当刷新率过低时会看起来像PPT。
视频数据的封装
每一部视频都是对编码好的视频轨和音频轨一起进行封装,主要的视频容器有:MPG、VOB、MP4、3GP、ASF、RMVB、WMV、MOV、Divx、MKV、FLV、TS/PS等。
轨道/流
交错排列,便于传输下载时音画同步。
- 视频流
- 音频流
- 字幕流
- ...
视频压缩
颜色空间
使用YUV方式数字化表示颜色,而不是RGB(不利于压缩),Y表示亮度,U和V表示色度。
- YUV444
- YUV422
- YUV411
- YUV420
压缩
利用视频相关性减少数据量
-
帧内压缩/空间压缩
压缩时只考虑本帧内的数据,与静态图像压缩类似。
-
帧间压缩/时间压缩
基于视频或动画前后两帧具有很大相关性的特点实现,视频压缩比较常用。
-
帧的编码类型
-
I-frame
帧内编码帧,只进行帧内预测,压缩率小。
-
P-frame
前向编码帧,可以帧间预测和帧内预测,参考前面已编码的I帧和P帧,压缩率高。
-
B-frame
双向编码帧,可以帧间预测和帧内预测,参考前后已编码的I帧和P帧,压缩率最高。
视频点播:节省带宽,高压缩率,使用B帧。
直播:低延迟,不使用B帧。
视频编辑:提高相应,个别使用全I帧。
-
-
视频编码格式
- H264:AVC
- H265:HEVC
- H266:VVC
直播推拉流协议
封装格式
-
MP4
Moov文件:储存metadata,位于mp4文件开头
mvhd文件:mp4文件整体信息,创建时间、文件时长等
trak:轨道,视频和音频轨道等
Stbl:媒体数据的索引以及时间信息
-
FLV
由文件头和多个tag组成。
FLV header
tag:audio、video、script(音频流、视频流、脚本流)
Not seekable(不支持拖拽)
名词解释
- 点播:视频播放
- 直播:观看直播
- 推流:主播将数据发送到CDN网络
- 拉流:观众从CDN拉取直播数据
推拉流协议
-
RTMP:Real-Time Messaging Protocol
推流协议,技术成熟,基于tcp协议,低延迟。
-
HTTP-FLV:HTTP+FLV
拉流协议,协议友好,格式简单,延迟较低。
-
HLS:HTTP Live Streaming
拉流协议,苹果公司提出的,每次分成一个个基于HTTP文件下载,形成一个m3u8播放列表文件,寻找可用媒体流播放(TS),延时高。
客户端工作总结
开播过程
- 图像采集
- 摄像头
- 屏幕
- 图像采集卡
- 图像处理(可选)
- 美颜
- 绿幕
- 头饰
- ...
- 编码+封装
- 推流
看播过程
- 拉流
- 解封装+解码
- 硬件解码
- 软件解码
- 图像处理
- 超分辨率
- 美图
- 渲染
- OpenGL
- VULKAN
- Native window
音画同步
使用视频对齐音频
总结
通过本节课程,我了解到了直播是如何一步步实现的。先是学习了视频的基本概念与组成元素,了解了常用的视频封装格式如MP4,FLV等,为方便视频压缩,引入了YUV颜色编码方式,并通过不同的帧间编码方式对视频进行压缩。接着是学习直播相关的推拉流协议,了解到了直播开播和看播的过程。虽然这节课的内容比较偏向于特定的知识点,在Android日常开发上用到的比较少,但是对知识面的拓展、技术面的提升有很大的用处。