音视频传输流程和编解码基本概念

音视频解码流程图

解协议:将流媒体协议(HTTP,RTMP等)的数据,解析为标准的相应的封装格式数据
解封装:将输入的封装格式的数据(MP4,MKV,RMVB,TS,FLV,AVI等),分离成为音频流压缩编码数据(如AAC编码的音频码流)和视频流压缩编码数据(如H.264编码的视频码流)
解码:将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据,音频的压缩编码标准包含AAC,MP3,AC-3等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等,通过解码视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等,音频数据输出成为非压缩的音频抽样数据,例如PCM数据
视音频同步:根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。
在这里插入图片描述

编码的作用与如何编码

编码的作用:压缩数据,一帧图片数据只记录与前一帧或后一帧的不同之处

如何编码
编码的目的:就是为了压缩,各种视频编码方式,都是为了让视频变得体积更小,有利于存储和传输,编码的核心思想是去除冗余信息
空间冗余:一帧图像内部相邻像素之间的相关性多造成的冗余;
时间冗余:视频图像序列中的不同帧之间的相关性造成的冗余;
视觉冗余:是指人眼不能感知或不敏感的那部分图像信息;
信息熵冗余:也称编码冗余,人们用于表达某一信息所需要的比特数总比理论上表示该信息所需要的最少比特数要大,它们之前的差距就是信息熵冗余,或称编码冗余;
知识冗余:是指在有些图像中还包含与某些验证知识有关的信息。

视频编码
通过特定的压缩技术,将某个视频格式文件转换成另一种视频格式文件的方式;
视频流传输中最重要的编解码标准有国际电联(ITU_T,国际电信联盟)的H.261、H.263、H.264等,运动静止专家组(由ISO国际标准化组织与IEC国际电子委员会于1988年联合成立)的MPEG系列标准MPEG1、MPEG2、MPEG4 AVC等;
其中ITU_T H.264/MPEG-4 AVC是ITU_T与ISO/IEC联手合作制订的新标准,ITU_T方面称之为H.264;但ISO/IEC将之归纳与MPEG系列,称为MPEG-4 AVC;
H.265被视为ITU_T H.264/MPEG-4 AVC标准的继任者,又称为高效率视频编码(High Efficiency Video Coding,简称HEVC)。
在这里插入图片描述

IPB帧和GOP

I帧(Intra coded frames):帧内编码帧,关键帧,I帧可以看作一个图像经过压缩之后的产物,可以单独解码出一个完整的图像;
P帧(Predicted frames):前向预测编码帧,记录了本帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终的画面;
B帧(Bi-directional predicted frames):双向预测编码帧,记录了本帧与前后帧的差别,解码需要参考前面一个I帧或者P帧,同时也需要后面的P帧才能解码一张完整的图像。
在这里插入图片描述
GOP(Group Of Pictures, 图像组)
是一组连续的图像,由一个I帧和多个B/P帧组成,是编解码器存取的基本单位

DTS和PTS

DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。
虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。

在视频采集的时候是录制一帧就编码一帧发送一帧的,在编码的时候会生成 PTS,这里需要特别注意的是 frame(帧)的编码方式,在通常的场景中,编解码器编码一个 I 帧,然后向前跳过几个帧,用编码 I 帧作为基准帧对一个未来 P 帧进行编码,然后跳回到 I 帧之后的下一个帧。编码的 I 帧和 P 帧之间的帧被编码为 B 帧。之后,编码器会再次跳过几个帧,使用第一个 P 帧作为基准帧编码另外一个 P 帧,然后再次跳回,用 B 帧填充显示序列中的空隙。这个过程不断继续,每 12 到 15 个 P 帧和 B 帧内插入一个新的 I 帧。P 帧由前一个 I 帧或 P 帧图像来预测,而 B 帧由前后的两个 P 帧或一个 I 帧和一个 P 帧来预测,因而编解码和帧的显示顺序有所不同,如下所示:
在这里插入图片描述
假设这里视频采集到的帧是这样子的

I B B P B B P

那么它的 PTS 对应的就是

PTS:1 2 3 4 5 6 7

编码顺序是:

1 4 2 3 7 5 6

推流顺序也是按照编码顺序去推的,即

I P B B P B B

那么接收断收到的视频流也就是

I P B B P B B

这时候去解码,也是按照收到的视频流一帧一帧去解的了,接收一帧解码一帧,因为在编码的时候已经按照 I、B、P 的依赖关系编好了,接收到数据直接解码就好了。

那么解码的顺序就是:

     I P B B P B B
DTS:1 2 3 4 5 6 7
PTS:1 4 2 3 7 5 6

可以看到解码出来对应的 PTS 不是顺序的,为了正确显示视频流,这时候我们就必须按照 PTS 调整解码后的 frame(帧),即

     I B B P B B P
DTS:1 3 4 2 6 7 5
PTS:1 2 3 4 5 6 7

可以看下面的图:
在这里插入图片描述
I frame 的解码不依赖于任何的其它的帧.而 p frame 的解码则依赖于其前面的 I frame 或者 P frame. B frame 的解码则依赖于其前的最近的一个 I frame 或者 P frame 及其后的最近的一个 P frame.

音视频同步

上面说了视频帧、DTS、PTS 相关的概念。我们都知道在一个媒体流中,除了视频以外,通常还包括音频。音频的播放,也有 DTS、PTS 的概念,但是音频没有类似视频中 B 帧,不需要双向预测,所以音频帧的 DTS、PTS 顺序是一致的。

音频视频混合在一起播放,就呈现了我们常常看到的广义的视频。在音视频一起播放的时候,我们通常需要面临一个问题:怎么去同步它们,以免出现画不对声的情况。

要实现音视频同步,通常需要选择一个参考时钟,参考时钟上的时间是线性递增的,编码音视频流时依据参考时钟上的时间给每帧数据打上时间戳。在播放时,读取数据帧上的时间戳,同时参考当前参考时钟上的时间来安排播放。这里的说的时间戳就是我们前面说的 PTS。实践中,我们可以选择:同步视频到音频、同步音频到视频、同步音频和视频到外部时钟。

H.264码流分析

H.264码流文件分为两层
1、VCL(Video Coding Layer,视频编码层):负责高效的视频内容表示,VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列;
2、NAL(Network Abstraction Layer,网络提取层):负责以网络所要求的恰当的方式对数据进行打包和传送,是传输层,不管在本地播放还是网络播放,都要通过这一层来传输;
VCL就是被压缩编码后的原始数据,在VCL数据封装到NAL单元中之后,才可以用于传输或存储。
在这里插入图片描述
Annexb格式,H264BSAnalyzer工具查看
一般H.264编码器的默认输出为:起始码+NALU(Nal单元)。起始码为:0x00000001或者0x000001;
每个NALU包含1个字节的Nal Header与若干整数字节的负荷数据EBSP构成;
其中Nal Header占用1个字节,此字节低5位表示NALU类型:
在这里插入图片描述

片和宏块

一帧图片经过H.264编码之后,就被编码为一个或多个片(slice),每片包含整数个宏块(至少一个宏块,最多包含整个图片宏块),NAL单元就是装载这这些片的载体。
在这里插入图片描述

RGB与YUV

RGB
牛顿利用三棱镜将太阳光分解成彩色的光带,各色光因其所形成的折射角不同尔彼此分离,就像彩虹一样,所以白光能分解成多种色彩的光;
经过不断地实验发现,红绿蓝(RGB)三种色光无法被分解,所以称他们为三原色光,等量的三原色光相加会变成白光;
在计算机里,R、G、B也被称为基色分量,它们的取值分别从0到255,一共256个等级,所以任何颜色都可以用RGB三个值的组合表示。

YUV
YUV主要应用于优化彩色视频信号的传输,与RGB相比,YUV只需要占用极少的频宽(RGB需要三个独立的视频信号同时传输);
YUV中Y代表明亮度,也称灰阶值,U与V表示的则是色度(色调和饱和度),也可以记作YCbCr,如果只有Y数据,那么表示的图像就是黑白的;
使用YUV格式才能极大地去除冗余信息,人跟低亮度信息更敏感,对色度敏感度不高,也就是说,可以压缩UV数据,二人眼难以发现;所以压缩算法的第一步,往往先把RGB数据转换成YUV数据,对Y少压缩一点,对UV多压缩一点,以平衡图像效果和压缩率,这也就是为什么编码选择使用YUV而不是RGB。
Gray=R0.30 + G0.59 + B*0.11//305911公式,RGB转换为灰度值,且转换不可逆

NV21与I420
YUV因为采用和数据排列方式的不同,又分为不同的存储格式。
一般的安卓摄像头输出为NV21格式,尔I420格式则是绝大多数编解码器默认输入输出格式。
NV21与I420占用空间计算
width * height + width/2 * height/2 + width/2 * height/2 = widthheight3/2
在这里插入图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值