Android开发|Android基础第五天 | 字节跳动第四届青训营笔记

这是我参与「第四届青训营 」笔记创作活动的的第5天
探索多媒体直播技术 课程回顾
1.网络请求框架 Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

2. 数据存储 Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

01 视频的基本元素
1.1 像素 像素:是指在由一个数字序列表示的图像中的一个最小单位,称为像素,通常表现为一个小方格。每个像素有自己的颜色值,一般为RGB三原色来表示。
Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

1.2 RGB三原色 每种颜色都可用三个变量来表示-红色绿色以及蓝色的强度。记录及显示彩色图像时,RGB是最常见的一种方案。
它们的取值,R、G、B分别从0到255,一共256个等级。
Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

1.3 分辨率 指的是纵横方向的像素数量,一般表示为:宽*高(or长*宽),720*1080等
Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

1.4 码率/比特率 【Android开发|Android基础第五天 | 字节跳动第四届青训营笔记】码率/比特率:表示单位时间内传送 bit的数目,单位bps,表示是单位时间播放连续的媒体如压缩后的音视频的bit数量,也称为码流。
这种bps的单位电信领域上表示速度,就是我们常说的网速了。100Mbps越高的比特率,需要更高的带宽来支撑,否则会带来卡顿、成本等问题太低的比特率,可能会导致视频画面过度压缩,模糊不清。

  • ffmpeg:视频处理工具
  • ffplay:视频播放工具
  • ffprobe:视频分析工具
1.5 帧 & 帧率 1.5.1 帧 Frame 理解帧就是视频或者动画中的每一张画面,而视频和动画特效就是由无数张画面组合而成,每一张画面都是一帧。
1.5.2 帧率 Frame Rate 每秒传输帧数通俗来讲就是指动画或视频的画面数、帧率。每秒钟帧数越多,所显示的动作就会越流畅。FPS也可以理解为我们常说的“刷新率”。当刷新率太低时我们肉眼都能感觉到屏幕的闪烁、不连贯,对图像显示效果和视觉感观产生不好的影响。
1.6 视频数据的封装 对于任何一部视频来说,只有图像,没有声音,肯定是不行的。所以,视频编码后,加上音频编码,要一起进行封装。
封装:就是封装格式,简单来说,就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中。再通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个饭盒,用来盛放饭菜的容器。
目前主要的视频容器有如下:MPG、 VOB、MP4、3GP、ASF、RMVB、WMV、MOV、Divx、MKV、FLV,TS/PS等。
1.7 轨道 / 流 ffprobe xxx.mp4
Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

多个流:
Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

视频流、音频流数据相互交错排列,形成混流。
【为什么要交错排列?】
→ 虽然视频与音频数据是可以独立存在的,不过合并到视频文件后,我们的文件一般是顺序下载的。一个位置的音视频数据相隔太远的话会造成卡顿、音画不同步

02 视频压缩
视频播放的本质:一帧一帧
如果视频没有压缩 → 数据量大
Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

2.1 颜色空间 简单来说,YUV就是另外一种颜色数字化表示方式。视频通信系统之所以要采用YUV,而不是RGB,主要是因为RGB信号不利于压缩。在YUV这种方式里面,加入了亮度这一概念。在最近十年中,视频工程师发现,眼睛对于亮和暗的分辨要比对颜色的分辨更精细一些,也就是说,人眼对色度的敏感程度要低于对亮度的敏感程度。
所以,工程师认为,在我们的视频存储中,没有必要存储全部颜色信号。我们可以把更多带宽留给黑—白信号(被称作“亮度”),将稍少的带宽留给彩色信号(被称作“色度”)。于是,就有了YUV.
YUV里面的“Y”,就是亮度(Luma ) , “U"和“V"则是色度(Chroma )。
Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

降采样。
2.2 GIF VS MP4 Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

Mp4比GIF小很多。
压缩:利用视频画面的相关性来减少数据量。
2.3 帧内压缩/空间压缩 帧内(Intraframe )压缩也称为空间压缩( Spatial compression )。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。
Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

2.4 帧间压缩 / 时间压缩 帧间压缩(Interirame compression)也称为时间压缩(Temporal_compression),是基于许多视频或动画的连续前后两帧具有很大的相关性(即连续的视频其相邻帧之间具有冗余信息)的特点来实现的。
通过比较时间轴上不同帧之间的数据实施压缩,进一步提高压缩比.一般是无损压缩。
2.4.1 帧的编码类型 l-frame: Intra-frame 帧内帧
P-frame: Predicted Frame前向预测帧
Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

B-frame: Bi-Directional frame 双向预测帧
由于B帧可以参考和插入在它之前和之后发生的两个(或更多))帧(在时间维度上),所以它可以显著降低帧的大小,同时保持视频质量。B帧能够利用空间冗余和时间冗余(未来的帧和过去的帧),这使得它在视频压缩中非常有用。
Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

2.4.2 比较 Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

视频改变播放进度后,如果不在同一个GOP中,需要从新位置所在的GOP的I帧开始解码拖动后起播所需的耗时取决于位置在GOP中的位置,越靠前能越快响应。
2.4.3 不同场景对GOP的设置也不一样
  • 视频点播:节省带宽,高压缩率,会使用B帧
  • 直播:低延迟,不使用B帧
  • 视频编辑:提高响应,个别会使用全Ⅰ帧
2.5 视频编码格式 H264 VS H265 Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

H265压缩比更高,需要更多的算力。
  • H264 :AVC更普及
  • H265 :HEVC更小体积
03 直播推拉流协议
3.1 CDN CDN:Content Delivery Network
Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

建立并覆盖在lnternet之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。通过智能调度将用户请求到最接近用户的服务节点,降低用户访问延迟,提升可用性。
边缘节点:指在靠近用户的网络边缘侧构建的业务平台,提供存储、计算、网络等资源,将部分关键业务应用下沉到接入网络边缘,以减少网络传输和多级转发带来的宽度和时延损耗。
3.2 不同场景的视频通信方案 Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

3.3 视频数据的封装 3.3.1 MP4 Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

是指按照一定的规则,将视频数据、音频数据等,放到一个文件中。
常见的MKV、AVI以及本文介绍的MP4等,都是封装格式。
Moov: Movie Box,存诸mp4 metadata,-般位于mp4文件的开头。
mvhd: Movie Header Box, mp4文件的整体信息,比如创建时间、文件时长等
trak: Track Box,一个mp4可以包含一个或多个轨道(比如视频轨道、音频轨道)
Stbl: Sample Table Box
包含了这些媒体数据的索引以及时间信息
3.3.2 FLV Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

FLV是一个二进制文件,由文件头(FLV header)和很多tag组成。
tag又可以分成三类:audio,video,script,分别代表音频流,视频流,脚本流(关键字或者文件信息之类)
3.4 推拉流协议 Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

RTMP: Real-Time Messaging Protocol
HTTP-FLV: HTTP + FLV
HLS: HTTP Live Streaming
3.4.1 推流协议 实时消息协议(英语: Real-Time Messaging Protocol,缩写RTMP)也称实时消息传输协议,是最初由Macromedia为通过互联网在Flash播放器与一个服务器之间传输流媒体音频、
视频和数据而开发的一个专有协议。后被Adobe 公司收购。
Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

  • 优势:
基于tcp协议
技术成熟,Ffmpeg项目中有rtmp 库
低延迟
  • 劣势:
停止更新
规范上没有支持H265
使用1935端口,会被防火墙阻碍
3.4.2 拉流协议 HTTP-FLV
Flash Video(简称FLV),是一种网络视频格式,用作流媒体格式。
协议友好,格式简单,便于分发
不转码的情况下直接转发即可,延迟较低
拉流协议:HTTP Live Streaming,缩写为HLS,是由苹果公司提出基于HTTP的流媒体网络传输协议。
是苹果公司QuickTime X和iPhone软件系统的一部分。它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的展M3U (m3u8)播放列表文件,用于寻找可用的媒体流。
HLS只请求基本的HTTP报文,与实时传输协议(RTP)不同,HLS可以穿过任何允许HTTP数据通过的防火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。
Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

3.4.3 对比 Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

04 客户端工作及总计
Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

4.1 开播过程 Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

4.2 图像采集
  • 摄像头
  • 屏幕
  • 图像采集卡
4.3 图像处理
  • 美颜
  • 绿幕
  • 头饰
4.4 看播过程 Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

4.5 开播、看播对比 Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

05 课程总结
flv和mp4的区别在于文件格式不同,解析方式不同。
1、 文件格式:flv是流式文件,mp4是容器式文件。
2、解析方式不同:flv文件可以边传输边解析,而mp4文件则不行。
Android开发|Android基础第五天 | 字节跳动第四届青训营笔记
文章图片

    推荐阅读