这是我参与「第四届青训营 」笔记创作活动的第8天
探索多媒体直播技术
课程回顾
课前回顾了下表格内容和两道选择题,这里就直接写知识点了
- Retrofit 底层是使用 OkHttp 进行网络请求的
- Room 框架的注解 @Dao 和 @Database 在编译期
视频的基本元素
像素
是指在由一个数字序列表示的图像中的一个最小单位,称为像素,通常表现为一个小方格。每个像素有自己的颜色值,一般为RGB 三原色来表示。
RGB 三原色
每种颜色都可用三个变量来表示-红色绿色以及蓝色的强度。记录及显示彩色图像时,RGB是最常见的一种方案。
它们的取值,R、G、B分别从0到255,一共256个等级。
可以在 www.sessions.edu/color-calcu… 上控制游标感觉颜色的变化
分辨率
指的是纵横方向的像素数量,一般表示为:宽高 (or 长宽),720*1080等
常见分辨率
CCTV 一般 1080P
手机一般 1080P 至 2k
码率 / 比特率
表示单位时间内传送 bit 的数目,单位bps,表示是单位时间播放连续的媒体如压缩后的音视频的bit数量,也称为码流。
这种bps的单位电信领域上表示速度,就是我们常说的网速了。比如 100Mbps,要换算成一般下载时显示的速度则除以 8,即 100 / 8 = 12.5mb/s 。
越高的比特率,需要更高的带宽来支撑,否则会带来卡顿、成本等问题。
太低的比特率,可能会导致视频画面过度压缩,模糊不清。
通过改变码率可以让视频文件在保持帧率、分辨率的情况下减少文件体积。
帧&帧率
帧(Frame)
理解帧就是视频或者动画中的每一张画面,而视频和动画特效就是由无数张画面组合而成,每一张画面都是一帧。
帧率 (Frame Rate)
每秒传输帧数通俗来讲就是指动画或视频的画面数、帧率。每秒钟帧数越多,所显示的动作就会越流畅。
FPS 也可以理解为我们常说的“刷新率”。当刷新率太低时我们肉眼都能感觉到屏幕的闪烁、不连贯。
对图像显示效果和视觉感观产生不好的影响。
当然如果视频 or 直播最高默认是 30帧,则 30 帧和 60 帧的动画是看不出差别的。
封装
对于任何一部视频来说,只有图像,没有声音,肯定是不行的。所以,视频编码后,加上音频编码,要一起进行封装。
简单来说,就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中。再通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个饭盒,用来盛放饭菜的容器。 目前主要的视频容器有如下: MPG、VOB、MP4、3GP、ASF、RMVB、WMV、MOV、Divx、MKV、FLV、TS/PS等。 封装之后的视频,就可以传输了,
你也可以通过视频播放器进行解码观看。
视频压缩
视频播放的本质:将视频画面从封装文件中进行解码、渲染
TUV 420
1/3 + 1/3 * 1/4 + 1/3 * 1/4
= 1/2
GIF VS MP4
GIF 图与 MP4 有点相似,都是包含了一组会动态图像的文件
但是相同内容的 GIF 和 MP4 文件体积相差非常大,GIF 会比 MP4 大上好几倍,主要原因是 GIF 缺少帧间编码,无法有效地利用图像间的相关信息
左边是 git 图,右边是 mp4
帧内压缩 / 空间压缩
帧内(Intraframe)压缩也称为空间压缩(Spatial compression)。当压缩一帧图像时,
仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。
帧内一般采用有损压缩算法,达不到很高的压缩比。
帧间压缩 / 时间压缩
帧间压缩(Interframe compression)也称为时间压缩(Temporal_compression),是基于许多视频或动画的
连续前后两帧具有很大的相关性(即连续的视频其相邻帧之间具有冗余信息)的特点来实现的。
通过比较时间轴上不同帧之间的数据实施压缩,进一步提高压缩比.一般是无损压缩。
I-frame:Intra-frame 帧内帧 P-frame:Predicted Frame 前向预测帧
B-frame:Bi-Directional frame
由于B帧可以参考和插入在它之前和之后发生的两个(或更多)帧(在时间维度上),所以它可以显著降低帧的大小,同时保持视频质量。B帧能够利用空间冗余和时间冗余(未来的帧和过去的帧),这使得它在视频压缩中非常有用。
各种帧类型对比
不同类型的帧组合成 GOP 的概念
视频改变播放进度后,如果不在同一个 GOP 中,需要从新位置所在的 GOP 的 I 帧开始解码
拖动后起播所需的耗时取决于位置在 GOP 中的位置,越靠前能越快响应
不同场景对 GOP 的设置也不一样
视频点播:节省带宽,高压缩率,会使用 B 帧
直播:低延迟,不使用 B 帧
视频编辑:提高响应,个别会使用全 I 帧
视频编码格式 H264 VS H265
H265 压缩比更高,需要更多的算力
H264 : AVC 更普及
H265 : HEVC 更小体积
直播推拉流协议
CDN: Content Delivery Network
建立并覆盖在Internet 之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。通过智能调度将用户请求到最接近用户的服务节点,降低用户访问延迟,提升可用性。
边缘节点:指在靠近用户的网络边缘侧构建的业务平台,提供存储、计算、网络等资源,将部分关键业务应用下沉到接入网络边缘,以减少网络传输和多级转发带来的宽度和时延损耗
不同场景的视频通信方案
封装格式:MP4
Moov:Movie Box,存储 mp4 的 metadata,一般位于mp4文件的开头。
mvhd:Movie Header Box,mp4文件的整体信息,比如创建时间、文件时长等
trak:Track Box,一个mp4可以包含一个或多个轨道(比如视频轨道、音频轨道)
Stbl:Sample Table Box
包含了这些媒体数据的索引以及时间信息
封装格式:FLV
FLV是一个二进制文件,由文件头(FLV header)和很多tag组成。
tag又可以分成三类:audio,video,script,分别代表音频流,视频流,脚本流(关键字或者文件信息之类)
推拉流协议
RTMP : Real-Time Messaging Protocol
HTTP-FLV:HTTP + FLV
HLS : HTTP Live Streaming
推流协议
实时消息协议(英语:Real-Time Messaging Protocol,缩写RTMP)
也称实时消息传输协议,是最初由Macromedia为通过互联网在Flash播放器与一个服务器之间传输流媒体音频、视频和数据而开发的一个专有协议。后被Adobe公司收购。
优势:
•基于 tcp 协议
•技术成熟,Ffmpeg 项目中有 rtmp 库
•低延迟
劣势
•停止更新
•规范上没有支持 H265
•使用 1935 端口,会被防火墙阻碍
HTTP-FLV Flash Video(简称FLV),是一种网络视频格式,用作流媒体格式。 协议友好,格式简单,便于分发
不转码的情况下直接转发即可,延迟较低
HTTP Live Streaming
缩写为HLS是由苹果公司提出基于HTTP的流媒体网络传输协议。
是苹果公司QuickTime X和iPhone软件系统的一部分。它的工作原理是把整个流分成一个个小的基于HTTP的文件
来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的
资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的扩展
M3U (m3u8)播放列表文件,用于寻找可用的媒体流。
HLS只请求基本的HTTP报文,与实时传输协议(RTP)不同,HLS可以穿过任何允许HTTP数据通过的防火墙或者
代理服务器。它也很容易使用内容分发网络来传输媒体流。
M3u8 一级请求返回
相对地址
自适应码率 根据不同的带宽决定使用合适的源
M3u8 二级请求返回
视频文件数据
各方案对比
客户端工作
推流端
采集方式:摄像头、屏幕、图像采集卡等
图像处理的场景:美颜、绿幕、头饰
拉流端
课程总结
flv 和 mp4 的区别在于文件格式不同和解析方式不同
- 文件格式不同:flv是流式文件,mp4是容器式文件
- 解析方式不同:flv文件可以边传输边解析,而mp4文件则不行
推荐阅读: