多媒体直播概览 | 青训营笔记

167 阅读6分钟

这是我参与「第四届青训营 」笔记创作活动的第8天 今天的内容是多媒体直播概览

视频基本元素

  • 像素:用数字序列表示图像的最小单位。
  • RGB:用数字表示颜色的一种方法 RGB支持红绿蓝各256色,而HDR支持各1024色。支持的色数用位深来表示,RGB8bit,HDR10bit
  • 分辨率:横纵方向的像素数目 分辨率高会提升视频的清晰度,但也会增加设备的能耗
  • 码率/比特率:单位时间内传送的bit的数目 码率越高,画面压缩程度越低,但对网络宽带要求也升高
  • 帧/帧率:视频中的每个瞬间画面称为帧,每秒钟视频播放的帧数成为帧率(FPS,frame per second)
  • 视频容器 视频数据是rgb数据,声音数据是pcm数据(模拟脉冲信号),这两种数据要分别存储,同步播放,这就需要视频容器来封装。这就是mp4等格式
  • 轨道/流:轨道/流就是一组连续播放的数据信息 一个视频通常有一个视频流,若干个音频流和若干个字幕流,以支持多语言和不同规格的声道 视频流和音频流交错排列,形成混流。交错单位称为packet。ffprobe -show_packets {name}.mp4。为什么要交错排列呢?这样可以避免解码卡顿,同时支持边下载边播放。

ffmpeg包

ffmpeg:视频处理工具,格式转换,降码率等 ffmplay:视频播放工具 ffmproebe:视频分析工具,可以查看视频流信息和帧信息

视频压缩

视频播放的本质

视频播放的本质就是把视频从容器中还原出来。假如视频没有压缩,相当于要完整的存储每一帧图片,耗费天文数量的存储空间。 近年来,工程师发现人们对亮度的敏感强于对颜色的敏感,于是就出现了YUV格式,Y是亮度,UV是色度。YUV420格式保留Y值,而每四个像素共用一个UV值,压缩量达到50%

视频压缩的技术

视频压缩的核心思想是:利用视频画面的相关性减少对冗余信息的存储。

  • 帧内压缩/空间压缩 对于颜色相近的像素块,可以共用同样的信息,这与静态图像压缩类似。
  • 帧间压缩/时间压缩 利用残差值叠加来表示后一帧,可以不必完整的绘制后裔帧的信息。因此,帧可以分为I帧(帧内帧)和P帧(前向预测帧),I帧是不依赖其他帧的,P帧靠与前一帧的差值来表示。可以想到,P帧的压缩率是很高的。 更近一步,考虑到动画在起点-终点的动画往往是流畅的,可以用B帧(双向预测帧)利用两个I/P帧的信息进行解码。进一步压缩

帧间压缩大大节省了视频的空间占用,但在解码时就必须找到I帧才能进一步对P/B帧进行解码,这就形成了解码的GOP,这是视频解码的最小单位。 在视频播放上会使用B帧,而在直播时为了降低延迟,往往不使用B帧,视频编辑时因为要精确响应,可能连P帧都不使用

视频编码格式 H264/H265/H266

编码格式 H264:AVC已经广泛普及,H265:HEVC正逐渐推广,H266:VVC还未广泛应用 无论如何,压缩比越高,对解码算力的需求也就越高,否则便容易造成卡顿

视频推拉流协议

封装格式

  • MP4最大的特点是结构化,存储了大量的元数据。
  • FLV没有MP4那么大的层级结构,由文件头和很多tag组成,tag分为audio,video,script分别代表音频,视频和脚本流。

MP4在加载之后便对视频信息一清二楚,相对应的FLV则没有提供原生的元数据,因此在某些播放器上不可拖拽只能顺序播放。但在直播中由于无法预知视频的结构,往往采用FLV

传输网络

CDN:content delivery network 从web服务器到各级缓存节点逐级分发,找到的边缘节点离服务器越近,耗时越少。

  • 点播:播放视频
  • 看播:观看视频
  • 推流:将数据发送到CDN
  • 拉流:从CDN获取直播数据

视频通信方案选择

一般的直播通过CDN网络,以HTTP-FLV协议进行传输,在低延迟场景(连麦pk)时可使用WebRTC。 推拉流协议有RTMP,HTTP-FLV,HLS,常用的方案是RTMP推流和转发,FLV进行拉流。

RTMP是基于tcp协议的,对FLV进行的一个封装,因此在网络传输和数据转发上非常快,ffmpeg项目中有RTMP库。但可能会被防火墙拦截,并且苹果公司不支持。 因此拉流只要去掉RTMP头,就可以用HTTP-FLV进行数据传输。 对于苹果设备,则使用HLS。其原理是吧整个流分成一个个小的基于HTTP的文件来下载。进行请求时,其会用M3U8进行请求逐级请求,根据不同的码率使用不同的二级转发,最终获取ts视频容器。

客户端工作

开播过程

采集->处理->编码+封装->推流

  • 图像采集 在安卓上会利用Camera类获取摄像头信息,或者用电脑摄像头、截屏、图像采集卡进行图像采集。
  • 图像处理 绿幕、动效、美颜等,一般使用OPENGL进行处理(了解其原理和使用方法,对做视频行业有用)

看播过程

拉流->解封装+解码->图像处理->渲染

  • 拉流 HLS,HTTP-FLV
  • 去封装解码 GPU硬件解码(兼容性不完善),CPU软件解码
  • 图像处理 超分辨率等
  • 渲染 OpenGL,VULKAN等

音画同步

全力解码,缓存到内存中,然后向音频对齐。如果视频无法对齐,可能会等待缓冲或丢帧。

播放器

谷歌exoplayer,bilibili ijkplayer,接入播放器是比较简单的,但视频的码率、传输协议、超分辨率等体系问题是日常工作中优化的关键步骤。