音视频流媒体原理以及直播平台的搭建

流媒体

当下,直播已经火了几年,人们已经不仅仅满足与文字、而是更多的在于“类面对面”交流,能够实时感知对方的表情、动作。而大红大紫的直播,就是基于流媒体技术的。

流媒体是什么?流媒体就是指采用流式传输技术在网络上连续实时播放的媒体格式。流媒体技术也称流式媒体技术。音视频就是流媒体的核心。

音视频常见术语定义规范

音视频组成

一个完整的视频文件,包括音频、视频和基础元信息,我们常见的视频文件如 MP4MOVFLVAVIRMVB 等视频文件,就是一个容器的封装,里面包含了音频和视频两部分,并且都是通过一些特定的编码算法,进行编码压缩过后的。

H.264Xvid 等就是视频编码格式,MP3AAC 等就是音频编码格式。例如:将一个 Xvid 视频编码文件和一个 MP3 音频编码文件按 AVI 封装标准封装以后,就得到一个 AVI 后缀的视频文件。

因此,视频转换需要设置的本质就是

  • 设置需要的视频编码
  • 设置需要的音频编码
  • 选择需要的容器封装

一个完整的视频转换设置都至少包括了上面 3 个步骤。

编码格式

音频编码格式

常用音频格式:

  • AAC
  • AMR
  • PCM
  • OGG(ogg vorbis 音频)
  • AC3(DVD 专用音频编码)
  • DTS(DVD 专用音频编码)
  • APE(monkey’s 音频)
  • WMA

音频编码方案之间音质比较: AAC+ > MP3PRO > AAC > RealAudio > WMA > MP3

目前最常见的音频格式有 MP3AC-3ACCMP3 最广泛的支持最多,AC-3 是杜比公司的技术,ACCMPEG-4 中的音频标准,ACC 是目前比较先进和具有优势的技术。

视频编码格式

视频编码标准有两大系统: MPEGITU-T,国际上制定视频编解码技术的组织有两个,一个是“国际电联(ITU-T)”,它制定的标准有 H.261H.263H.263+H.264H.265 等,另一个是“国际标准化组织(ISO)”它制定的标准有 MPEG-1MPEG-2MPEG-4 等。

常见编码格式有:

  • Xvid(MPEG4)
  • H.264 (目前最常用编码格式)
  • H.263
  • AC-1
  • RM,RMVB
  • H.265(因兼容性问题,不常用)

目前最常见的视频编码方式的大致性能排序基本是: MPEG-1/-2 < WMV/7/8 < RM/RMVB < Xvid/Divx < AVC/H.264(由低到高,可能不完全准确)。

H.265 出来之前,H.264 是压缩率最高的视频压缩格式,其优势有: 低码率、高质量的图象、容错能力强、网络适应性强

H.264 最大的优势是具有很高的数据压缩比率,在同等图像质量的条件下,H.264 的压缩比是 MPEG-2 的 2 倍以上,是 MPEG-4 的 1.5~2 倍。举个例子,原始文件的大小如果为 88GB,采用 MPEG-2 压缩标准压缩后变成 3.5GB,压缩比为 25∶1,而采用 H.264 压缩标准压缩后变为 879MB,从 88GB 到 879MB,H.264 的压缩比达到惊人的 102∶1。低码率对 H.264 的高的压缩比起到了重要的作用,和 MPEG-2MPEG-4 ASP 等压缩技术相比,H.264 压缩技术将大大节省用户的下载时间和数据流量收费。尤其值得一提的是,H.264 在具有高压缩比的同时还拥有高质量流畅的图像,正因为如此,经过 H.264 压缩的视频数据,在网络传输过程中所需要的带宽更少,也更加经济。

目前这些常见的视频编码格式实际上都属于有损压缩,包括 H.264H.265,也是有损编码,有损编码才能在质量得以保证的前提下得到更高的压缩率和更小体积。

视频码率、帧率、分辨率

码率

码流(Data Rate)是指视频文件在单位时间内使用的数据流量,也叫码率或码流率,通俗一点的理解就是取样率,是视频编码中画面质量控制中最重要的部分,一般我们用的单位是 kb/s 或者 Mb/s。一般来说同样分辨率下,视频文件的码流越大,压缩比就越小,画面质量就越高。码流越大,说明单位时间内采样率越大,数据流,精度就越高,处理出来的文件就越接近原始文件,图像质量越好,画质越清晰,要求播放设备的解码能力也越高。

当然,码率越大,文件体积也越大,其计算公式是 文件体积 = 时间 * 码率。例如,网络上常见的一部 90 分钟 1Mbps 码率的 720P RMVB 文件,其体积就 = 5400 秒 * 1Mbps / 8 = 675MB。

通常来说,一个视频文件包括了画面(视频)及声音(音频),例如一个 RMVB 的视频文件,里面包含了视频信息和音频信息,音频及视频都有各自不同的采样方式和比特率,也就是说,同一个视频文件音频和视频的比特率并不是一样的。而我们所说的一个视频文件码流率大小,一般是指视频文件中音频及视频信息码流率的总和。

帧率

帧率也称为 FPS(Frames Per Second),即帧/秒。是指每秒钟刷新的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次。越高的帧速率可以得到更流畅、更逼真的动画。每秒钟帧数越多,所显示的动作就会越流畅。

分辨率

视频分辨率是指视频成像产品所成图像的大小或尺寸。常见的视像分辨率有 1280*720 (720p)1920*1080 (1080p)2560*1440 (2k)。在成像的两组数字中,前者为图片长度,后者为图片的宽度,两者相乘得出的是图片的像素。

帧率、码率与分辨率之间关系

三者没有任何关系

  • 码率关系带宽、文件体积
  • 帧率关系画面流畅度和图形处理消耗
  • 分辨率关系图像尺寸

视频存储及压缩

图像存储

(挖坑,原理与图片压缩有关)

音频存储

(挖坑,原理与音频压缩有关)

帧压缩 (H.264)

视频是利用人眼视觉暂留的原理,通过播放一系列的图片,使人眼产生运动的感觉。单纯传输视频画面,视频量非常大,对现有的网络和存储来说是不可接受的。为了能够使视频便于传输和存储,人们发现视频有大量重复的信息,如果将重复信息在发送端去掉,在接收端恢复出来,这样就大大减少了视频数据的文件,因此有了各种视频压缩标准,比如 H.264H.265M-JPEG 等。

减少数据量的基本方法

在一系列的帧内,可以通过差分编码这样的方法来减少视频数据量,包括 H.264 在内的大多数视频压缩标准都采用这种方法。在差分编码中,会将一个帧与参考帧进行对比,然后只对那些相对于参考帧来说发生了变化的像素进行编码。通过这种方法,可以降低需要进行编码和发送的像素值。

序列中的三个图像分别作为独立的图像进行编码和发送,彼此之间互不依赖

对差分编码(包括H.264在内的大多数视频压缩标准都采用这种方法)来说,只有第一个图像是将全帧图像信息进行编码|

H.264 压缩标准中 I帧P帧B帧 用于表示传输的视频画面。

  1. I帧
    I帧又称帧内编码帧,是一种自带全部信息的独立帧,无需参考其他图像便可独立进行解码,可以简单理解为一张静态画面。视频序列中的第一个帧始终都是I帧,因为它是关键帧。

  2. P帧
    P帧又称帧间预测编码帧,需要参考前面的I帧才能进行编码。表示的是当前帧画面与前一帧(前一帧可能是I帧也可能是P帧)的差别。解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。与I帧相比,P帧通常占用更少的数据位,但不足是,由于P帧对前面的P和I参考帧有着复杂的依耐性,因此对传输错误非常敏感。

  3. B帧
    B帧又称双向预测编码帧,也就是B帧记录的是本帧与前后帧的差别。也就是说要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是对解码性能要求较高。
    带有I帧、B帧和P帧的典型视频序列。P帧只需要参考前面的I帧或P帧,而B帧则需要同时参考前面和后面的I帧或P帧。

一般平均来说,I帧的压缩率是7(跟JPG差不多),P帧是20,B帧可以达到50,可见使用B帧能节省大量空间,节省出来的空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。

流媒体传输协议

常用的流媒体协议主要有 HTTP 渐进下载和基于 RTSP/RTP 的实时流媒体协议,在实时监控领域比较常见。

CDN 直播中常用的流媒体协议包括 RTMPHLSHTTP FLV

RTMP

RTMP (Real Time Messaging Protocol)实时消息传送协议是 Adobe 公司为 Flash 播放器和服务器之间音频、视频和数据传输 开发的开放协议。RTMP 工作在 TCP 之上,通过明文传输,使用端口 1935,收到数据后立刻转发,一般延迟在 1-3s 左右。

HLS

HTTP Live Streaming(HLS)是苹果公司实现的基于 HTTP 的流媒体传输协议,可实现流媒体的直播和点播。HLS 点播,基本上就是常见的分段 HTTP 点播,不同在于,它的分段非常小。基本原理就是将视频或流切分成小片(TS), 并建立索引(M3U8).

HLS 协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS 格式),而客户端则不断的下载并播放这些小文件,因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。此外,分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。不过 HLS 的这种技术特点,决定了它的延迟一般总是会高于普通的流媒体直播协议 (大约在10s)。

HTTP-FLV

HTTP-FLV 基于 HTTP 长连接,通 RTMP 一样,每个时刻的数据,收到后立刻转发,只不过使用的是 HTTP 协议,一般延迟在 1-3s

我的直播平台架构

架构

去集群看下服务

推流

拉流