探索多媒体直播技术|青训营笔记

124 阅读8分钟

这是我参与「第四届青训营 」笔记创作活动的第4天,随着课程推进,已经基本介绍了完了Android开发所需要的基本知识。但是仅仅能够开发出一个APP是远远不够的,面对用户不断变化不断出现的新需求,我们也需要更多的的技术去使这些需求落地。 随着移动通信技术的发展,网络速度已经从原来的B/s变成了M/s,甚至可以达到G/s,网速的提升给我们的手机使用方式带来了新的想象空间,从文字到图片再到视频,如今的风口就是直播。人们接收信息的方式有静态变为动态,这其中的提升仅靠前面学的技术是远远不够的,就需要新的技术将这些数据处理后才能传送到用户面前。 直播的定义是广播电视节目的后期,播出同时进行的播出方式,本质上仍然是视频,但是更讲究时效性。因此直播技术的基础还是视频图像技术,进一步才是流数据处理。 因此首先还是从视频讲起,无论图片还是视频,都离不开像素的概念。像素是指在一个有数字序列表示的图像中的一个最小单位,每个像素有自己的颜色值,一般为RGB三原色表示。根据面向的对象不同,有对应的颜色模型,面向硬件设备(显示器,摄像机,打印机)等的RGB模型,面向颜色处理的HSI模型,印刷行业和电视信号传输中常用的CMYK和YUV系统等等。RGB模型可以更好地适应颜色,但是HSI模型更符合人描述和理解颜色的方式,采用饱和度,色调,强度三个指标描述,但是这些指标的得到也离不开RGB三基色。 接着就是分辨率的概念。无论是不是发烧友,在选购电视,电脑,手机时,都会听到宣传1080P屏幕,2K屏,电视上有4K,甚至8k。这些数字代表的就是分辨率,分辨率指纵横方向的像素数量,一般采用乘积的形式表示,如1920×1080,2560×1440等,不同分辨率及名称如图所示:

image (30).png 再接着是码率,用过哔哩哔哩的小伙伴或许会知道,开启大会员后可以享受高码率的视频内容,那什么是码率呢?码率也叫比特率,表示单位时间内传送Bit的数目,单位bps,表示是单位时间内播放连续的媒体如压缩后的音视频的bit数量也叫码流。从这个单位也可以看出和我们平时说的网速很像,因此码率和网速是息息相关的,比特率越高,需要的带宽越高,相应的就更容易卡顿,比特率太低画面会被过度压缩,模糊不清。 然后是帧和帧率视频宣传页往往不仅会有分辨率还有帧率的渲染,如4K120帧HDR之类,旗舰手机也把高帧率体验当卖点宣传,其实视频也可以看作是一组连续播放的图片,而帧就是这些图片也就是视频中的一个画面。而帧率就是每秒钟可以显示的帧数,帧率多数,人的视觉看起来就会越流畅,单位是FPS,帧率也叫刷新率。 最后一个概念就是轨道或者流了,大家可能会听说音轨,声道这些概念,这些就是轨道或者流。一个视频并非只有画面,也有声音,对于图像和声音的截然不同,但是视频文件要将其放一起,怎么处理呢,就出现了轨道和流,单独存储声音,单独存储图像。一般来说,视频流和音频流交错排列,形成混流,确保音画同步。 介绍完基本要素,就需要谈谈视频压缩了,首先来看一道计算题,一个视频的数据如图所示:

image (31).png 如果不压缩,是多大呢?2160piexl3840pixel24ps6240s310bits=3.7210^13,也就是大小超过4000GB,普通的电脑手机根本不够存储,所以视频压缩就显得必要且重要。主流的压缩方法有两种,帧内压缩也叫空间压缩,压缩时仅考虑本帧的数据不考虑冗余,和静态图片压缩类似,是有损压缩。另一种是帧间压缩,也叫时间压缩,我们知道连续前后两帧图片之间往往具有很大的相关性即连续视频相邻帧之间有冗余信息,通过比较时间轴上不同帧之间的数据进行压缩进一步提高压缩比,一般是无损压缩。这里引入几个概念,I/B/P帧。I帧表示关键帧,保留完整的一帧画面,解析时只需要解析本真数据就可以完成;P帧表示这一帧与之前帧的差别,解码用之前缓存的画面叠加差别得到最终画面;B帧表示双向帧,记录本帧与前后真的差别,解码时不仅需要前一帧的画面,还需要解码后面的画面,压缩率高大,但是CPU解码会比较累,三种帧的总结如图:

image (32).png 压缩方式一般为GOP,Group of Pictures.视频改变播放进度后,如果不在一个GOP中,需要从新位置所在I帧开始解码,拖动后,起播所需的耗时取决于位置在GOP中的位置,越靠前响应越快。不同场景对GOP的设置也不一样,视频点播为了节省带宽,提高压缩率,会使用B帧;直播对延迟要求比较高,不使用B帧,视频编辑为了提高相应,部分会全使用I帧。 由于压缩的方法不同,就出现了不同的视频格式,需要对应的解码格式才能对其进行解码,如H264:AVC更普及;H265:HEVC,体积更小,压缩比更高,需要更多的算力。 讲完了视频压缩,就该将我们是如何看到直播了,这就需要推拉流协议。首先需要了解一个概念CDN,内容分发网络,建立并覆盖在Internet之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。使用时,通过智能调度,将用户请求到最近的服务节点,降低延迟,提升可用性。边缘节点指靠近用户的网络边缘侧构建的业务平台,提供存储,计算,网络等资源,将部分关键业务应用下沉到网络边缘,减少网络传输和多级转发带来的宽度和时延损耗,不同场景下的视频通信方案如图:

image.png 上面出现的HTTP-FLV,MP4就是常见的视频封装格式。封装格式就是按照一定的规则,将视频数据,音频数据放到一个文件中。常见的MKV,MP4,FLV都是封装格式。 MP4格式封装的文件中有Moov,mvhd,trak,Stbl等数组组成,Moov也就是MovieBox,用来存储MP4的metadata,一般位于开头;mvhd是movie HeaderBox的缩写,存放文件的整体信息,创建时间,文件时长等;Trak即trackBox,存储轨道信息;stbl即sample Table Box包含数据的索引及时间信息。 FLV格式封装的文件是一个二进制文件,由文件头FLV Header和很多tag组成,tag分为audio,video,script三类,对应音频流,视频流,脚本流(存储关键字或者关键信息) 常见的推拉流协议有三种:RTMP,HTTP-FLV,HLS三种 推流协议RTMP是Real-Time Messaging Protocol的缩写,也叫实时消息协议或者实时消息传输协议,最初是为了解决flash播放器和服务器之间传输流媒体音视频和数据而开发的专有协议,优势在于基于TCP协议成熟,而且支持的狂多,如ffmpeg就支持,延迟低,劣势也很明显,已经停更了,而且不支持H265,使用1935端口,会被防火墙拦截。 拉流协议HTTP-FLV,是HTTP与FLV结合的协议,协议友好,格式简单,便于分发,不转码的情况下直接转发即可延迟较低。 拉流协议HTS是HTTP Live Streaming的缩写,是苹果公司提出的基于HTTP的流媒体网络传输协议,工作原理如图所示:

image.png 三种协议总结对比如图:

image (33).png

image (34).png 直播开播的过程:图像采集-图像处理-编码+封装-推流 看直播的过程:拉流(HLS/HTTP-FLV)-解封装+解码(视频数据解码为RGB图像,软件解码和硬件解码两种方式)-图像处理(超分辨率/美图)-渲染(OpenGL/Vulkan/NativeWindow.