H.266/VVC技术学习57:视频属性杂谈(2)

杂谈部分主要讲讲自己初学时不懂的,而且是过了好久好久才理解的内容(心痛啊)。这里做一个简要的记录及痛心的会议,比较面向还没入门的同学,希望会有所帮助吧。

前一期视频属性杂谈 我们讨论了视频的构成要素,也知道了显示在屏幕上的视频,是像素值是由yuv按序排列形成并通过SDL播放。这一期我们向上层进发,了解一下.yuv是怎么形成的,进而了解一下我们电脑里常有的.mp4、.avi等等视频文件是如何播放出来的,并且对码流文件的组成也初步认识一下。

1 yuv文件的形成

终于涉及到专业相关了哈哈哈哈哈。看了上一篇杂谈最后的计算环节,有没有感觉一个yuv太大了呢?一个高清电影就占了1T硬盘?事实上并非如此,我们不会用yuv来存放视频文件,而常见的.MP4和yuv的关系,将会在读完本博后得以了解。

1.1 引子

我们的电脑里经常会存放.mp4、.avi、.mkv、.flv、.ts等等常见的视频文件。
西部世界S03要上演了,回味一下。我呢,用potplayer打开了西部世界S01E01,右键点属性,看到了播放信息如下图。
在这里插入图片描述
首先我们看到了解码器都是ffmpeg,这是个大杀器,里面有完整的将.mp4转换为.yuv的过程。

1.1 从.mp4到.bin

我们看到了,这个.mp4实际上就是把视频信息和音频信息封装了起来。我们看的视频文件,实际上是两部分:没有声音的画面以及声音。这两部分封装类似于一个压缩包。上图文件封装了HEVC编码的视频、AC3编码的音频。

对于音频,就是本科DSP种学过的,把声波做时域采样(频率一般是44100Hz?),多声道会多几次采样,采样位数应该是量化相关,然后去除编码冗余,即进行熵编码。由于我对音频研究几乎为0,就不多说啦,如果这部分有问题请大家指出~

下面我们主要说前者,视频信息部分:编码的视频码流。

1.2 从.bin到.yuv

前两句说到HEVC编码的码流,可能还会有一些懵逼。但要说,它可以叫做.bin文件,是不是有点熟悉了呢?是的,它就是一个二进制码流文件,.bin文件存了很多0和1,把这些01放进编好的解码器里就会生成视频像素数据.yuv,但这个.bin文件比.yuv是小了成百上千倍,可见视频编码的威力啦。我们用字节级16进制的方法来一睹.bin文件的真容:
在这里插入图片描述

说到这里,很多同学,尤其是实验室的同学应该就很熟悉了!从.bin到.yuv就是解码操作啊,运行个VTM8.0解码端就是做了个这啊!

这部分内容就是专业性比较强的视频编解码算法的内容,包含帧内预测、帧间预测、变换量化、熵编码、环路滤波等技术。博主的其他博客基本都是这方面相关的技术,有兴趣可以查阅。

综上,借雷神的图,可表示如下:
在这里插入图片描述

2 码流.bin文件的组成

这部分,有些偏离属性主题了,但对于做编码的初学者可以了解一下~ 跳过也不影响太多理解的。

下面要深入一下我们常见的.bin文件。这东西一看吓一跳啊,这部分内容如需深究请查阅JVET-Q2001里面的表格部分,这里只作单纯的框架理解。

2.1 .bin = PSD + (StartCodePrefix +NALU) x N

PSD:Parameter Set Data,表示参数级数据
NALU:Network Abstract Layer Unit

一个码流文件首先确定视频的通用参数PSD,占一小部分。其余部分分成N个NALU来存储,每个NALU前面会有一个标记,即开始码StartCodePrefix,每遇到一个开始码表示开始了一个NALU。

在H.264种,一般一帧就是一个NALU,在H.265有所放开,有多种分组方式,如有兴趣了解,请看万老师书P289。

2.2 NALU = NALU header + NALU payload

NALU header:即NALU头,长度为固定的2字节,反映NALU的内容特征。
NALU payload:即NALU载荷长度,为整数字节,承载视频压缩后的比特流片段,也就是编码出的主体内容。但比特流形成NALU payload的过程,需要经过整数字节化和冲突避免

2.3 NALU payload ≈ RBSP

RBSP:Raw Byte Sequence Payload,原始字节序列载荷。
经过冲突避免后的RBSP可以作为NALU的载荷信息。

其实RBSP就是

2.4 RBSP = SODB + RBSP trailing bits

SODB:String Of Data Bits,比特流——这其实才是最纯粹最真诚的码流。
RBSP trailing bits:RBSP尾比特

SODB只需要从左到右、从上到下解析即可。内部存的东西就是我们预测变换滤波等,经过熵编码输出出去的二进制。
RBSP尾由称为RBSP停止比特的一个比特1和其后的零个或多个比特0组成。

因此RBSP就是整数字节化的SODB,就是说SODB这一堆01,最终占位并非整数字节。而NALU payload需要整数字节,因此要将其整数字节化,随后冲突避免即可。

2.5 SODB:这里才是我们一直做的!

2.6 小结

综上,从.bin文件到真实解码的码流SODB,需要进行一个较复杂的过程。首先要在码流文件中获取NALU,随后转化为RBSP,进而获取真实裸流进行解码形成yuv。

可粗略理解如下:

.bin = PSD + startCodePrefix + naluHeader + SODB + rbspTrailingBits 
		   + startCodePrefix + naluHeader + SODB + rbspTrailingBits 
		   + startCodePrefix + naluHeader + SODB + rbspTrailingBits 
		   + ...

3 视频信息相关

上面说了那么多,估计这波都走偏了,以上主要从.mp4入手说了两条路径:
1、把.mp4到.bin到每一个二进制码字介绍了一遍,反过来就是编码到封装的过程。
2、把.mp4到.bin到.yuv最终到电脑屏幕这一过程作为暗线,介绍了解码及播放的原理。

但既然说的是视频的属性,当然还是要说说视频信息内容。那么就继续以这个视频介绍:
在这里插入图片描述
上面这张图是不是暴露了些什么。。。啊这都不是重点,我们来一一分析。
概要部分呢都是常见的信息,我们以视频信息为重点来谈:

1、Format:就是编解码格式,这里是HEVC(HighE ficiency Video Codng),是H.265的,应该说是比较新的了。

2、Fornat _Profile:就是视频的档次,这里是Main10,支持10比特深度,像素的颜色更多些,色彩更加细致。比特深度相关概念见下7。

3、BitRate:就是比特率。2783kbps表示每秒需要传输2783千比特,即需要2.7M/S的网速才可以无损传输此视频,当然视频播放的过程中帧率会有较大的变化,如画面不稳定,色彩较艳丽等情况。

4、FrameRate:就是帧率,这里是每秒要传输23.976帧,且恒定。其实在视频的播放过程中,帧率是不断变化的,这里的恒定指变化比较轻微。

5、ColorSpace:就是色彩空间,这里的YUV在前一期杂谈已经提过。

6、ChromaSubsampling:就是色度下采样的模式,这里的4:2:0在前一期杂谈也已经提过。

7、Bitdepth:就是比特深度,8比特深度表示Y、U、V三个分量都有28个颜色等级,取值[0,255]。同理10比特深度即10个颜色等级,取值[0,1023]。

8、Bits/(pixel*frame) :就是数据密度,视频每1帧图像中1单位像素所分配到的平均码流,在视频编码中一般叫bpp,和码率控制相关。

9、BT.709:是一种色彩标准,基本是视频上可以看到的最好的色彩了。

猜你喜欢

转载自blog.csdn.net/weixin_42979679/article/details/104624944
今日推荐