1、Why ?
相信在你的电脑里,一定存有一些已经下载好的视频文件,如果你硬说没有,那我相信你曾经总有吧?曾经也没有?那我想对你说曾经免费的时候你不下载,直到电影都收费才后悔那些年错过下载的大片。
好了,言归正传,在日常我们一定见过很多后缀为avi, mp4, rmvb, flv等格式的视频文件。而很少有人真正挖掘这些文件到底是什么?其实以上格式都是封装视频的封装格式。
什么是封装格式 ?
把音频数据和视频数据打包成一个文件的规范。不用封装格式差距不大, 各有千秋。
从视频播放器播放一个互联网上的视频文件
需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,其他步骤相同。
-
解协议:流媒体协议的数据,解析为标准的相应的封装格式数据
-
解封装:将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。
-
解码:就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。
-
视音频同步:就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。
为什么要对视频数据进行编码
视频编码的主要作用是将视频像素数据(RGB,YUV等)压缩成视频码流,从而降低视频的数据量。举个例子:比如当前手机的屏幕分辨率是1280 * 720(即我们平时在视频软件中可选的720P),假设一秒钟30帧(即1秒钟传输30张图片),那么一秒钟的数据为 1280 * 720(位像素)*30(张) / 8(1字节8位)(结果B)
,也就是一秒钟的数据量为3.456M数据量,一分钟就是207.36M,那么我们平常看一部电影就是大约18G的流量,试想下如果是这样对于存储即网络传输是件多么恐怖的事情。
正是因为以上原因,我们需要对视频数据进行编码,以最小程序减小清晰度与最大程序降低数据量,而H264正是目前广泛使用的一种编码格式,下面我们将主要介绍下H264的码流结构。
2、码流结构
刷新图像概念
在我们的印象中,一张图片就是一张图像,而在H264中图像是个集合的概念。
帧、顶场、底场都可以称为图像。一帧通常就是一幅完整的图像。当采集视频信号时,如果采用逐行扫描,则每次扫描得到的信号就是一副图像,也就是一帧。当采集视频信号时,如果采用隔行扫描(奇、偶数行),则扫描下来的一帧图像就被分为了两个部分,这每一部分就称为「场」,根据次序分为:「顶场」和「底场」。「帧」和「场」的概念又带来了不同的编码方式:帧编码、场编码。逐行扫描适合于运动图像,所以对于运动图像采用帧编码更好;隔行扫描适合于非运动图像,所以对于非运动图像采用场编码更好。
H264原始码流
-
结构:由一个接一个的 NALU 组成的,而它的功能分为两层,VCL(视频编码层)和 NAL(网络提取层).
-
VCL:包括核心压缩引擎和块,宏块和片的
-