直播知识点

直播知识点

直播就是将每一帧数据(Video/Audio/Data Frame),打上时序标签(Timestamp)后进行流式传输的过程。发送端源源不断的采集音视频数据,经过编码、封包、推流,再经过中继分发网络进行扩散传播,播放端再源源不断的下载数据并按时序进行解码播放。实现“边生产、边传输、边消费”的直播过程

直播流程思维导图

直播知识点

协议差异

全称 协议 原理 延时
RTMP Real Time Messaging Protocol 长连接TCP 每个时刻的数据,接受后立即转发
HLS HTTP Live Streaming 短连接HTTP 集合一段时间数据,生成ts切片文件,更新m3u8
HTTP-FLV RTMP over HTTP 长连接HTTP 同RTMP,使用HTTP协议

内容部分转载自H.264码流以及H.264编解码的基本概念

基本概念

分辨率:图像分辨率则是单位英寸中所包含的像素点数,分辨率影响图像大小,与图像大小成正比:分辨率越高,图像越大;分辨率越低,图像越小

码率:码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps(即,千位每秒)。 通俗一点的理解就是采样率,单位时间内采样率越大精度就越高,处理出来的文件就越接近原始文件,但是文件体积与采样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真。但是因为编码算法不一样,所以也不能用码率来统一衡量音质或者画质。

码率影响体积,与体积成正比:码率越大,体积越大;码率越小,体积越小。短视频的建议码率在600-2000k,直播内部会根据网络状况自动调整码率。

帧率:帧率即每秒显示帧数,帧率表示图形处理器处理场时每秒钟能够更新的次数。高的帧率可以得到更流畅、更逼真的动画。一般来说30fps就是可以接受的,但是将性能提升至60fps则可以明显提升交互感和逼真感,但是一般来说超过75fps一般就不容易察觉到有明显的流畅度提升了。如果帧率超过屏幕刷新率只会浪费图形处理的能力,因为监视器不能以这么快的速度更新,这样超过新率的帧率就浪费掉了。

影响画面流畅度,与画面流畅度成正比:帧率越大,画面越流畅;帧率越小,画面越有跳动感。如果码率为变量,则帧率也会影响体积,帧率越高,每秒钟经过的画面越多,需要的码率也越高,体积也越大。帧率建议在20-30FPS

关键帧:相当于二维动画中的原画,指角色或者物体运动或变化中的关键动作所处的那一帧,它包含了图像的所有信息,后来帧仅包含了改变了的信息。如果你没有足够的关键帧,你的影片品质可能比较差,因为所有的帧从别的帧处产生。对于一般的用途,一个比较好的原则是每5秒设一个关键键。但如果时那种实时传输的流文件,那么要考虑传输网络的可靠度,所以要1到2秒增加一个关键帧。

推流:将采集的⾳音频,视频数据通过流媒体协议发送到流媒体服务器

拉流:从流媒体服务器器获取⾳音频、视频数据

其它名词解释也可以参考:

视频编解码

软编码和硬编码的概念

  • 软编码:使用CPU进行编码
  • 硬编码:不使用CPU进行编码,使用显卡GPU,专用的DSP、FPGA、ASIC芯片等硬件进行编码。

软编码和硬编码的比较

软编码:实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低,低码率下质量通常比硬编码要好一点。

硬编码:性能高,低码率下通常质量低于硬编码器,但部分产品在GPU硬件平台移植了优秀的软编码算法(如X264)的,质量基本等同于软编码。

iOS系统中的硬编码

苹果在iOS 8.0系统之前,没有开放系统的硬件编码解码功能,不过Mac OS系统一直有,被称为VideoToolBox的框架来处理硬件的编码和解码,终于在iOS 8.0后,苹果将该框架引入iOS系统。

H.264编码原理以及I帧B帧P帧

H.264规范是Motion Picture Experts Group(MPEG)所定义的MPEG-4的一部分

在H264协议里定义了三种帧,完整编码的帧叫I帧,参考之前的I帧生成的只包含差异部分编码的帧叫P帧,还有一种参考前后的帧编码的帧叫B帧

H264采用的核心算法是帧内压缩帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。

H.264与其他形式的MPEG压缩一样,通过以下两个维度缩小了视图文件的尺寸:

空间:压缩独立视频帧,被称为帧内压缩
时间:通过以组为单位的视频帧压缩冗余数据,这一过程称为帧间压缩
帧内压缩通过消除包含在每个独立视频帧内的色彩及结构中的冗余信息来进行压缩。因此可在不降低图片质量的情况下尽可能缩小尺寸。这类压缩同JPEG压缩的原理类似。帧内压缩也可以作为有损压缩算法,但通常用于对原始图片的一部分进行处理以生成极高质量的照片。通过这一过程创建的帧称为I-frames。
帧间压缩,很多帧被组合咋一起作为一组图片(简称GOP),对于GOP所存在的时间维度的冗余可以被消除。如果想象视频文件中的典型场景,就会有一些特定运动元素的概念,比如行驶的汽车或街上走路的行人,场景的背景环境通常是固定的。固定的背景环境就代表一个时间维度上的冗余,这个冗余及可以通过压缩方式进行消除

对序列的说明

在H264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流,以I帧开始,到下一个I帧结束

一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。

一个序列就是一段内容差异不太大的图像编码后生成的一串数据流。当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个I帧,然后一直P帧、B帧了。当运动变化多时,可能一个序列就比较短了,比如就包含一个I帧和3、4个P帧。

对三种帧的介绍

视频压缩中,每帧代表一幅静止的图像。而在实际压缩时,会采取各种算法减少数据的容量,其中IPB就是最常见的。简单地说,I帧是关键帧,属于帧内压缩,解码时单独的该帧便可完成解码;P帧为向前预测编码帧,即P帧解码时需要参考前面相关帧的信息才能解码;B帧为双向预测编码帧,解码时既需要参考前面已有的帧又需要参考后面待解码的帧;他们都是基于I帧来压缩数据。

I帧表示关键帧,又称intra picture,I帧画面完整保留,解码时只需要本帧数据就可以完成(因为包含完整画面)。

P帧前向预测编码帧 又称predictive-frame,表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)

B帧双向预测内插编码帧 又称bi-directional interpolated prediction frame,是双向差别帧,也就是B帧记录的是本帧与前后帧的差别,换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累。

因此,I帧和P帧的解码算法比较简单,资源占用也比较少,I帧只要自己完成就行了,至于P帧,也只需要解码器把前一个画面缓存一下,遇到P帧时就使用之前缓存的画面就行。如果视频流只有I和P,解码器可以不管后面的数据,边读边解码,线性前进。如果视频流还有B帧,则需要缓存前面和当前的视频帧,待后面视频帧获得后,再解码。

PTS DTS

PTSPresentation Time StampPTS主要用于度量解码后的视频帧什么时候被显示出来,DTS主要用于视频的解码,在解码阶段使用。

DTSDecode Time StampDTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码,PTS主要用于视频的同步和输出,在display的时候使用。在没有B frame的情况下,DTSPTS的输出顺序是一样的.

GOP:两个I frame之间形成一个GOP,在x264中同时可以通过参数来设定bf的大小,即:I 和p或者两个P之间B的数量。

如果有B frame 存在的情况下一个GOP的最后一个frame一定是P.

下面给出一个GOP为15的例子,其解码的参照frame及其解码的顺序都在里面:

直播知识点

如上图:I frame 的解码不依赖于任何的其它的帧.而P frame的解码则依赖于其前面的I frame或者P frame.B frame的解码则依赖于其前的最近的一个I frame或者P frame 及其后的最近的一个P frame.


内容来自视音频数据处理入门:H.264视频码流解析

H.264原始码流(又称为“裸流”)是由一个一个的NALU组成的。他们的结构如下图所示。

直播知识点

其中每个NALU之间通过startcode(起始码)进行分隔,起始码分成两种:0x000001(3Byte)或者0x00000001(4Byte)。如果NALU对应的Slice为一帧的开始就用0x00000001,否则就用0x000001
H.264码流解析的步骤就是首先从码流中搜索0x0000010x00000001,分离出NALU;然后再分析NALU的各个字段。本文的程序即实现了上述的两个步骤。


序列参数集 SPS 和图像参数集 PPS
参考iOS RTMP 视频直播开发笔记(3)- 了解 H.264 编码

  • SPS 包含的是针对一连续编码视频序列的参数,如标识符 seq_parameter_set_id、帧数及 POC 的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等等。
  • PPS 对应的是一个序列中某一幅图像或者某几幅图像,其参数如标识符 pic_parameter_set_id、可选的 seq_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等等。

这里 SPS 和 PPS 的含义可以不用深入追究,需要明白的是,在视频发送时,这两个参数需要作为第一帧发送出去,这样后边的I、B、P 帧才能顺利解码播放。