数字音视频知识点汇总(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012886093/article/details/90765831

### 视频存储格式YUV

1)YUV简介

YUV格式有两大类:planar和packed。

对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。

对于packed的YUV格式,每个像素点的Y,U,V是连续交*存储的。

YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。U也称作Cb,V也称作Cr,分别是蓝色差和红色差(YCbCr)

与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。

2)YUV存储格式

YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0,关于其详细原理,可以通过网上其它文章了解,这里我想强调的是如何根据其采样格式来从码流中还原每个像素点的YUV值,因为只有正确地还原了每个像素点的YUV值,才能通过YUV与RGB的转换公式提取出每个像素点的RGB值,然后显示出来。

用三个图来直观地表示采集的方式吧,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量。

3)YUV420类型

3.1) YUV420p和YUV420sp区别

因为YUV420比较常用, 在这里就重点介绍YUV420。YUV420分为两种:YUV420p和YUV420sp。

3.2) YUV420p和YUV420sp具体分类和详情

YUV420p:又叫planer平面模式,Y ,U,V分别再不同平面,也就是有三个平面。

YUV420p又分为:他们的区别只是存储UV的顺序不一样而已。

I420:又叫YU12,安卓的模式。存储顺序是先存Y,再存U,最后存V。YYYYUUUVVV

YV12:存储顺序是先存Y,再存V,最后存U。YYYVVVUUU

YUV420sp:又叫bi-planer或two-planer双平面,Y一个平面,UV在同一个平面交叉存储。

YUV420sp又分为:他们的区别只是存储UV的顺序不一样而已。

NV12:IOS只有这一种模式。存储顺序是先存Y,再UV交替存储。YYYYUVUVUV

NV21:安卓的模式。存储顺序是先存Y,再存U,再VU交替存储。YYYYVUVUVU

一般来说,直接采集到的视频数据是RGB24的格式,RGB24一帧的大小size=width×heigth×3 Bit,RGB32的size=width×heigth×4,YUV标准格式4:2:0 的数据量是 size=width×heigth×1.5 Bit。

在采集到RGB24数据后,需要对这个格式的数据进行第一次压缩。即将图像的颜色空间由RGB2YUV。因为,X264在进行编码的时候需要标准的YUV(4:2:0)。

经过第一次数据压缩后RGB24->YUV(I420)。这样,数据量将减少一半,经过X264编码后,数据量将大大减少。将编码后的数据打包,通过RTP实时传送。到达目的地后,将数据取出,进行解码。完成解码后,数据仍然是YUV格式的,所以,还需要一次转换,就是YUV2RGB24。

### H264裸流结构组成

H.264 的基本流由一系列NALU (Network Abstraction Layer Unit )组成,不同的NALU数据量各不相同。H.264 草案指出,当数据流是储存在介质上时,在每个NALU 前添加起始码:0x000001 或 0x00000001, 来指示一个NALU 的起始和终止位置。在这样的机制下,在码流中检测起始码,作为一 个NALU的起始标识,当检测到下一个起始码时,当前NALU结束。

H.264 码流中每个帧的开头的3~4个字节是H.264 的start_code(起始码),0x00000001或者0x000001。3字节的0x000001只有一种场合下使 ,就是一个完整的帧被编为多个slice(片)的时候,包含这些slice的NALU 使用3字节起始码。其余场合都是4字节0x00000001的。 每个NALU单元由一个字节的 NALU头(NALU Header)和若干个字节的载荷数据(RBSP)组成。

& 常见的帧类型

NAL_SLICE = 1 非关键帧 NAL_SLICE_DPA = 2 NAL_SLICE_DPB = 3 NAL_SLICE_DPC =4

NAL_SLICE_IDR =5 关键帧 NAL_SEI = 6 增强帧 NAL_SPS = 7 SPS帧

NAL_PPS = 8 PPS帧 NAL_AUD = 9 分隔符 NAL_FILLER = 12

### I帧和IDR帧的区别

中文都把 I 帧翻译成关键帧了,不过既然提到了 IDR 帧,可以展开说明一下。所有的 IDR 帧都是 I 帧,但是并不是所有 I 帧都是 IDR 帧,IDR 帧是 I 帧的子集。I 帧严格定义是帧内编码帧,由于是一个全帧压缩编码帧,通常用 I 帧表示 “关键帧”。IDR 是基于 I 帧的一个 “扩展”,带了控制逻辑,IDR 图像都是 I 帧图像,当解码器解码到 IDR 图像时,会立即将参考帧队列清空,将已解码的数据全部输出或抛弃。重新查找参数集,开始一个新的序列。这样如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR 图像之后的图像永远不会使用 IDR 之前的图像的数据来解码。

I 帧:帧内编码帧,I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面),一个GOP中,I帧是编解码的起点,有效防止帧间预测误差累计扩散。

P帧:(差别帧)保留这一帧跟之前帧的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(P帧没有完整画面数据,只有与前一帧的画面差别的数据)

B帧:(双向差别帧)保留的是本帧与前后帧的差别,解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累.

### 直播体验优化

这其实是一个直播过程中传输网络不可靠时的容错问题。例如,播放端临时断网了,但又快速恢复了,针对这种场景,播放端如果不做容错处理,很难不出现黑屏或是重新加载播放的现象。

为了容忍这种网络错误,并达到让终端用户无感知,客户端播放器可以考虑构建一个FIFO(先进先出)的缓冲队列,解码器从播放缓存队列读取数据,缓存队列从直播服务器源源不断的下载数据。通常,缓存队列的容量是以时间为单位(比如3s),在播放端网络不可靠时,客户端缓存区可以起到“断网无感”的过渡作用。

& 物理上优化线路,逻辑上优化策略,比如选择性丢帧,不影响编码画质的前提下减轻传输体积.

### 直播秒开策略

大部分播放器都是拿到一个完成的 GOP 后才能解码播放,基于 FFmpeg 移植的播放器甚至需要等待音画时间戳同步后才能播放.

GOP 的第一帧通常都是关键帧,由于加载的数据较少,可以达到 “首帧秒开”。

& 如果直播服务器支持 GOP 缓存,意味着播放器在和服务器建立连接后可立即拿到数据,从而省却跨地域和跨运营商的回源传输时间。从缓存 GOP 改成缓存双关键帧(减少图像数量),这样可以极大程度地减少播放器加载 GOP 要传输的内容体积。

& 提前做好 DNS 解析(省却几十毫秒),和提前做好测速选线(择取最优线路)。经过这样的预处理后,在点击播放按钮时,将极大提高下载性能。

& 除了移动端可以做体验优化之外,直播流媒体服务端架构也可以降低延迟。例如收流服务器主动推送 GOP 至边缘节点,边缘节点缓存 GOP,播放端则可以快速加载,减少回源延迟。

### QoS(网络视频传输的服务质量)

QoS(Qualityof Service)服务质量,是网络的一种安全机制, 是用来解决网络延迟和阻塞等问题的一种技术。在正常情况下,如果网络只用于特定的无时间限制的应用系统,并不需要QoS,比如Web应用,或E-mail设置等。但是对关键应用和多媒体应用就十分必要。当网络过载或拥塞时,QoS 能确保重要业务量不受延迟或丢弃,同时保证网络的高效运行。

ITU将服务质量定义为决定用户对服务的满意程度的一组服务性能指标。从另一角度来说,QoS参数也是流媒体媒体传输的性能指标。主要的QoS参数有如下几项:传输带宽,传输时延和抖动,丢包率。

1.传输带宽

传输带宽也指的是数据传输的速率。对于流媒体的播放,影响最大的属性就是传输带宽。如果带宽过低,使得数据传输下载的速度小于视频流播放的数率,那么在视频的播放将会经常出现停顿和缓冲,极大的影响了客户观看的流畅性;而为了保证视频观看的流畅性,在低带宽的条件下,只能选择低品质、低码流的视频进行传输,这样又会影响到客户的光看效果。所以,一个良好的传输带宽环境是客户活动高品质的流媒体体验的重要保证。

2.传输时延和抖动

传输时延定义为从服务器端发送数据到接受端接收到该数据之间的时间差,它是用来描述网络时延的一个指标。时延抖动定义为网络传输延时的变化率。流媒体最重要一个特性的就是实时性强,所以流媒体通信需求更难于满足的是对通信系统的传输时延限制。时延限制主要是用在具有实时性要求的交互分布式实时流媒体应用中,如视频会议系统,为防止时延给交互式通信带来不便,建议的最大端到端的总时延不要超过150ms,否则交互双方会感到明显的时延,给双方的信息交流带来不便。端到端的时延可分为以下四个部分:

1.信息源的媒体采样、压缩编码和打包的时延;

2.传输时延;

3.接收端的排队和播放缓冲时延;

4.接收端的拆包、解码和输出时延。

抖动定义为网络传输延时的变化率。时延抖动对流媒体播放质量的影响非常大,一般会采用缓存排队的办法平滑数据报的抖动。但如果数据传输的抖动较大,则必须采用大的缓存,这将直接造成更大的时延,直接影响流媒体的体验效果。

3.丢包率

流媒体数据传输中的时延和抖动是可以通过缓存的办法减少影响,所以流媒体业务可以允许在一定范围内的时延和抖动。但丢包会对流媒体数,据播放质量造成极其重大的影响。丢包率会造成视频和音频质量严重恶化,小的丢包率会造成图像的失真和语音的间歇中断,过高的丢包率甚至可以导致业务的中断。网络设计的目标是丢包率为零,但显然不存在这样的理想网络。所以丢包的大小将直接决定流媒体业务质量的好坏。

**丢包的处理方式:FEC前项纠错,在发送A,B包的同时发送C包,C包是A&B的异或,A和B包同时丢包的概率比较小,

所以丢失A或B包会从C包中恢复。

### 字节序

现代的计算机系统一般采用字节(Octet, 8 bit Byte)作为逻辑寻址单位。当物理单位的长度大于1个字节时,就要区分字节顺序(Byte Order, orEndianness)。常见的字节顺序有两种:Big Endian(High-byte first)和Little Endian(Low-byte first),这就是表2.1中的BE和LE。Intel X86平台采用Little Endian,而PowerPC处理器则采用了Big Endian。举例来说,整型数字$1234ABCD存储的时候就会有两种方式:

字节顺序

内存数据

备注

Big Endian (BE)

0xAB 0xCD 0x12 0x34

此时的0xAB被称为most significant byte (MSB)

Little Endian (LE)

0xCD 0xAB 0x34 0x12

此时的0xCD被称为least significant byte (LSB)

大端: 低地址存放最高有效位(MSB),既高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

小端: 低地址存放最低有效位(LSB),既低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。

猜你喜欢

转载自blog.csdn.net/u012886093/article/details/90765831