直播架构浅析

192 阅读6分钟

流媒体

  1. 容器、文件

指定的视频文件格式,包括mp4, mkv, flv等等。其实就是一个容器,里面有视频流、音频流、字幕流。

  1. 媒体流

时间轴上的一段连续的数据,可以是音频也可以是视频,还可以是字幕。可以是压缩的也可以非压缩的

  1. 数据帧

组成媒体流的最小单位

  1. 编解码器: 视频编解码器 H.264 H.265 音频编解码器 ACC

以帧为单位实现压缩数据和原始数据之间的转换

  1. 复用

以某种规则将不同的媒体流放入容器中叫做复用,相反的过程就叫解复用

  1. 码率

码率是文件的基本特征。指的是单位时间内视频文件的使用量。可以根据码率和视频时长就能算出文件大小

  1. 帧率

视屏每一秒的播放的帧数,每秒显示的图片数。影响画面流畅度,与画面流畅度成正比:帧率越大,画面越流畅;帧率越小,画面越有跳动感。

参考文献:千万级直播架构 直播技术原理

简单架构图​​​

主播方是产生视频流的源头,由一系列流程组成:第一,通过一定的设备来采集数据;第二,将采集的这些视频进行一系列的处理,比如水印、美颜和特效滤镜等处理;第三,将处理后的结果视频编码压缩成可观看可传输的视频流;第四,分发推流,即将压缩后的视频流通过网络通道传输出去。

播放端,播放端功能有两个层面,第一个层面是关键性的需求;另一层面是业务层面的。先看第一个层面,它涉及到一些非常关键的指标,比如秒开,在很多场景当中都有这样的要求,然后是对于一些重要内容的版权保护。为了达到更好的效果,我们还需要配合服务端做智能解析,这在某些场景下也是关键性需求。再来看第二个层面也即业务层面的功能,对于一个社交直播产品来说,在播放端,观众希望能够实时的看到主播端推过来的视频流,并且和主播以及其他观众产生一定的互动,因此它可能包含一些像点赞、聊天和弹幕这样的功能,以及礼物这样更高级的道具。

主播服务器端提供的最核心功能是收集主播端的视频推流,并将其放大后推送给所有观众端。除了这个核心功能,还有很多运营级别的诉求,比如鉴权认证,视频连线和实时转码,自动鉴黄,多屏合一,以及云端录制存储等功能。另外,对于一个主播端推出的视频流,中间需要经过一些环节才能到达播放端,因此对中间环节的质量进行监控,以及根据这些监控来进行智能调度,也是非常重要的诉求。

image.png 直播技术点

直播数据流的完整流程

  1. 采集视频、音频

CCD图像传感器:用户图像的采集和处理,将其转换为电信号,一般为PCM格式

拾音器:用于声音的采集和处理并转换为电信号,一般为YUV或则RGB格式

使用的主要编码框架是AVFoundation:用来创建和播放实时视听媒体数据,同时也提供了object-c接口来操作这些数据,比如编辑、旋转、重编码等等。

  1. 处理视频

可以利用OpenGL ES,对视频帧进行各种加工(主要针对嵌入式设备)。或者使用GPUImage来实现美颜、滤镜的效果。

  1. 视频编解码

FFmepg框架是基于C语言(使用Java调用和Cpp调用的性能损耗差别不大)一个强大的视频编解码开源框架,内置了编码、解码、串流、播放功能。

常见的视频编码技术:

  • mpeg:帧间压缩,只保存连续帧之间有差别的地方
  • H.264
  • H.265
  • P帧(差别帧):保留跟上一帧之间的差别
  • B帧(双向差别帧)保留前后两帧之间的差别。还原依赖两帧,叠加三者即可还原,消耗CPU

音频编码技术:

AAC、MP3

视频码率控制

码率指的是单位时间内的数据传输量,分辨率指的是屏幕或者图像上的像素数量。他们对于视频的质量有着共同的影响。当分辨率较高的时候,每一帧包含的像素点就更多,为了维持其画面质量就需要更多的数据来描述每一帧,因此需要更高的码率来支持高分辨率。相反,对于低分辨率的屏幕使用较高的码率也是一种浪费。

运营商一般都会通过自定义码率的方式多搞几条线路的方式来应对不同网络环境下的用户,用户可根据自身网络环境选择不同的码率。用户称之为分辨率,此分辨率非彼分辨率,其实就是码率。

视频封装格式

我们日常生活中看到的视频格式其实就只是一个容器,里面存放了各种数据流,比如视频流、音频流、字幕流等。如何把这些流数据放到同一个容器中就是封装格式,常见的格式有FLV、MP4、TS等等。通常将会封装格式作为文件的格式,一般情况下,什么样格式的视频就是什么样格式的封装。

  1. 推流​

推流就是将封装好的视频文件,基于特定的流媒体传输协议在网络中进行传输的过程。常见的推流框架有ffmpeg,librtmp等等。

流媒体传输协议有:rtmp体系(rtmp、rtmps、rtmpT、rtmpe),rtp等等。

  1. 流媒体服务器​

nginx除了可以作为网关服务器、反向代理服务器之外,还可以用来配置流媒体服务器。

  1. 数据分发​

CDN:一种内容分发网络服务器,可以理解为昂贵的缓存服务器。

  1. 拉流​

拉流其实就是推流的一个逆过程。可以根据不同的需求选择不同的传输协议

image-20230720224827-1y1bsbo.png

  1. 解码​

编码的逆过程

  1. 播放​

ijkplayer:一个基于FFmpeg的开源Android/iOS视频播放器

  1. 聊天互动​

就是一个实时通讯系统,可以使用腾讯云提供的sdk,注意区别消息推送和im的区别。