音视频压缩:H264码流层次结构和NALU详解
前言:
为什么需要编码呢?比如当前屏幕是1280*720.一秒24张图片.那么我们一秒的视频数据是
1280*720(位像素)*24(张) / 8(1字节8位)(结果:B) / 1024(结果:KB) / 1024 (结果:MB) = 2.64MB
一秒的数据有2.64MB数据量。1分钟就会有100多MB。这对用户来说真心是灾难。所以现在我们需要一种压缩方式减小数据的大小.在更低 比特率(bps)的情况下依然提供清晰的视频。
H264: H264/AVC是广泛采用的一种编码方式。我们这边会带大家了解。从大到小排序依次是 序列,图像,NALU,片,宏块,亚宏块,块,像素。
问题背景:
前面在讲封装格式过程中,都有一个章节讲解如何将H.264的NALU单元如何打包到TS、FLV、RTP中,解装刚好相反,怎么从这些封装格式里面解析出一个个NALU单元。NALU即是编码器的输出数据又是解码器的输入数据,所以在封装和传输时,我们一般处理对象就是NALU,至于NALU内部到底是什么则很少关心。甚至我们在编解码时,我们只需要初始化好x264编码库,然后输入YUV数据,它就会给你经过一系列压缩算法后输出NALU,或者将NALU输入到x264解码库就会输出YUV数据。
这篇文章就初步带你看下NALU能传输那些数据,NALU的类型和结构以及H264码流的层次,最后通过分析工具分析下裸码流记性验证,你可以选择感兴趣章节阅读。
NALU结构:
H.264的基本流(elementary stream),也叫裸流(没有加格式封装),就是一系列NALU的集合,如下图所示:
用Notepad十六进制形式打开,以annexb格式存储的h264裸流文件内容:
NALU结构分为两层,包含了视频编码层(VCL)和网络适配层(NAL):
视频编码层(VCL即Video Coding Layer) :负责高效的视频内容表示,这是核心算法引擎,其中对宏块、片的处理都包含在这个层级上,它输出的数据是SODB;
网络适配层(NAL即Network Abstraction Layer) :以网络所要求的恰当方式对数据进行打包和发送,比较简单,先报VCL吐出来的数据SODB进行字节对齐,形成RBSP,最后再RBSP数据前面加上NAL头则组成一个NALU单元。
分层目的:
这样做的目的:VCL只负责视频的信号处理,包含压缩,量化等处理,NAL解决编码后数据的网络传输,这样可以将VCL和NAL的处理放到不同平台来处理,可以减少因为网络环境不同对VCL的比特流进行重构和重编码;
NLAU结构:
其实NALU的承载数据真实并不是RBSP(Raw Byte Sequence Playload)而是EBSP即(Extent Byte Sequence Payload),EBSP和RBSP的区别就是在 RBSP里面加入防伪起始码字节(0x03),因为H.264规范规定,编码器吐出来的数据需要在每个NALU添加起始码:0x00 00 01或者0x00 00 00 01,用来指示一个NALU的起始和终止位置,那么RBSP数据内部是有可能含有这种字节序列的,为了防止解析错误,所以在RBSP数据流里面碰到0x 00 00 00 01的0x01前面就会加上0x03,解码时将NALU的EBSP中的0x03去掉成为RBSP,称为脱壳操作。
原始字节序列负载 RBSP即Raw Byte Sequence Playload,因为VCL输出的 原始数据比特流 SODB即String Of Data Bits,其长度不一定是8bit的整数倍,为了凑成整数个字节,往往需要对SODB最后一个字节进行填充形成RBSP,所以从SODB到RBSP的示意图如下:
填充方式就是对VCL的输出数据进行8bit进行切分,最后一个不满8bit的字节第一bit位置1,然后后面缺省的bit置0即可
具体填充语法见下文:
原来文档中的解释:
主要的意思我的理解如下:
其中H.264规范规定,编码器吐出来的数据需要在每个NALU添加起始码:0x00 00 01或者0x00 00 00 01,用来指示一个NALU的起始和终止位置。
所以H.264编码器输出的码流中每个帧开头3-4字节的start code起始码为0x00 00 01或者0x00 00 00 01。
上面我们分析了NALU的结构以及每层输出数据的处理方法,但是对于NALU的RBSP数据二进制表示的什么含义并不清楚,下面分析下NALU的类型。
1. NALU Header
头信息协议如上图。
举例说明:
这其中NALU的RBSP除了能承载真实的视频压缩数据,还能传输编码器的配置信息,其中能传输视频压缩数据的为slice。
那么如果NLAU传输视频压缩数据时,编码器没有开启DP(数据分割)机制,则一个片就是一个NALU,一个 NALU 也就是一个片。否则,一个片由三个 NALU 组成,即DPA、DPB和DPC,对应的nal_unit_type 类型为 2、3和4。
通常情况我们看到的NLAU类型就是SPS、PPS、SEI、IDR的slice、非IDR这几种。
上面站在NALU的角度看了NALU的类型、结构、数据来源、分层处理的原因等,其中NLAU最主要的目的就是传输视频数据压缩结果。那么站在对数据本身的理解上,我们看下H.264码流的层次结构。
H.264层次结构:
其实为了理解H.264是如何看待视频数据,先要了解下视频的形成过程。其实你把多副连续的有关联图像连续播就可以形成视频,这主要利用了人视觉系统的暂留效应,当把连续的图片以每秒25张的速度播放,人眼基本就感觉是连续的视频了。动画片就是这个原理:一张图像里面相邻的区域或者一段时间内连续图像的相同位置,像素、亮度、色温差别比较小,所以视频压缩本质就是利于这种空间冗余和时间上冗余进行编码,我们可以选取一段时间第一幅图像的YUV值,后面的只需要记录和这个的完整图像的差别即可,同时即使记录一副图像的YUV值,当有镜头完全切换时,我们又选取切换后的第一张作为基本图像,后面有一篇文章回讲述下目前视频压缩的基本原理。
所以从这里面就可以引申以下几个概念:
所以视频流分析的对象可以用下面的图片描述:
如果站在数据的角度分析NALU的层次关系,如下图:
这里视频帧被划分为一个片或者多个片,其中slice数据主要就是通过NLAU进行传输,其中slice数据又是由:
一个Slice = Silce + Slice Data
一帧图片跟 NALU 的关联 :
一帧图片经过 H.264 编码器之后,就被编码为一个或多个片(slice),而装载着这些片(slice)的载体,就是 NALU 了,我们可以来看看 NALU 跟片的关系(slice)。
引用自: https://www.jianshu.com/p/9522c4a7818d
Slice片类型:
设置片的目的是限制误码的扩散和传输,也就是一帧图像中它们的编码片是互相独立的,这样假设其中一张图像的某一个片有问题导致解码花屏,但是这个影响范围就控制在这个片中,这就是我们平时看视频发现只有局部花屏和绿屏的原因。
Slice Data里面传输的是一个个宏块,宏块中的数据承载各个像素点YUV的压缩数据。一个图像通常被我们划分成宏块来研究,通常有16 16、16 8等格式。我们解码的过程也就是恢复这些像素阵列的过程,如果知道了每个像素点的亮度和色度,就能渲染出一张完整的图像,图像的快速播放即是视频。
刚才提到了宏块.那么什么是宏块呢?
宏块是视频信息的主要承载者。一个编码图像通常划分为多个宏块组成.包含着每一个像素的亮度和色度信息。视频解码最主要的工作则是提供高效的方式从码流中获得宏块中像素阵列。
一个宏块 = 一个16*16的亮度像素 + 一个8×8Cb + 一个8×8Cr彩色像素块组成。(YCbCr 是属于 YUV 家族的一员,在YCbCr 中 Y 是指亮度分量,Cb 指蓝色色度分量,而 Cr 指红色色度分量)
其中宏块MB的类型:
宏块的结构:
H.264码流示例分析:
这里我们分析一下H.264的NLAU数据,其中包括了非VCL的NALU数据和VCL的NALU。
H.264码流的NLAU单元:
4. 这里由于没有数据分割机制,所以一个NALU承载一个片,同时一个片就是一个视频帧;
4.至于NALU的非VCL数据SPS、PPS、SEI各个字段的含义具体解析放到下篇文章,这个信息对于解码器进行播放视频很重要,很多播放问题都是这个数据有问题导致的;
上面看了视频的GOP序列,视频帧信息和片的组成,下面分析片中的宏块信息;
H.264的层次结构:
总结:
本文主要讲述了平时研究和分析视频流对象的层次,然后这些视频数据通过NALU传输时,NALU的类型和层次关系,以及NALU数据在不同层次的输出。最后用视频分析工具分析了H.264裸码流验证了上述层次关系。
所以对H.264数据分析时,一定要了解你现在分析的层次和框架,因为每个层次我们关心的数据处理对象是不一样的,这个非常重要。
一般H.264的分析工具都是收费的,也有一些免费和裁剪版本供大家学习和使用。推荐几个:Elecard StreamEye、CodecVisa、VideoEye、H264Analyzer、H264Visa等,有时需要交叉使用才能完成对你关心信息的分析,这些都放到我的Git上了,大家获取使用即可。
引用原文
25fps i帧间隔50 用分析软件查看可以看出每50帧一个i帧,并发送sps、pps、sei
sps、pps、sei、I帧绑在一起发送
h264是什么格式
H264是一种视频压缩编码格式。H264,也称为AVC,是一种非常流行的视频压缩标准。它使用先进的编码技术来减少视频文件的大小,使得视频的传输和存储更为高效。H264广泛应用于各种视频应用,如流媒体服务、视频会议系统、数字电视广播以及蓝光光盘等。这种格式支持多种分辨率和帧率,并提供了优秀的图像质量。...
什么是H264格式?
H264格式是一种视频压缩标准,也被称为高级视频编码(Advanced Video Coding,AVC)。H264格式是由国际电信联盟(ITU-T)和视频编码专家组(VCEG)以及国际标准化组织(ISO)和国际电工委员会(IEC)的运动图像专家组(MPEG)共同开发的。它旨在提供比之前的视频编码标准更高的压缩效率,同时保持视频质量。
h264是什么格式
1、h264不属于视频格式,而是一种视频编码标准,跟avi、mpg不属于同一类。2、H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组和ISO\/IEC动态图像专家组联合组成的联合视频组提出的高度压缩数字视频编解码器标准。这个标准通常被称之为H.264\/AVC。3、H.264是国际标准化组织(ISO)和国际电信...
h264视频是什么格式?
H264视频是一种数字视频压缩格式,也被称为高级视频编码(AVC)或MPEG-4第十部分。这种格式被广泛用于高清视频的录制、压缩和发布。H264视频格式的主要特点包括其高效的压缩能力,使得视频文件在保持高质量的同时,能够大幅度减小文件大小。这种高效压缩是通过采用先进的编码技术实现的,包括帧内编码、图像分...
h264是什么视频格式,这种格式有什
视频编码方式的核心是将一种格式转换成另一种,而H.264、M-JPEG和MPEG系列标准是传输中不可或缺的编解码标准。总的来说,H.264凭借其低码率、高质量图像、强纠错能力和网络适应性,已成为现代视频传输和存储中的核心技术,无论是在线视频、流媒体还是高清内容,H.264都扮演着至关重要的角色。
h.265标准与h264标准有什么区别
一、答案简述:H.265标准相较于H.264标准,在视频压缩效率上有了显著的提升,同时提供了更好的图像质量。二、1. 压缩效率:H.265标准采用了更先进的压缩技术,相较于H.264,能够在相同的视频质量下,减少约一半的文件大小。这意味着在相同的网络带宽下,H.265可以传输更高质量的视频内容。2. 图像...
.h264是什
H.264是一种被MPEG-4标准所确立的高级视频编码格式,通常被称为AVC。作为当前最先进的视频编码技术之一,H.264以其高度的技术含量和代表的最新技术水平,被广泛应用于各种视频压缩和传输领域。它通过优化压缩算法,能够在保证画面质量的同时,显著减少视频文件的存储和传输需求,对于现代数字媒体和网络流媒体...
h264是什么视频文件格式
H264是一种压缩编码方式 不是格式 H264压缩后通常会以TS或者TP格式封装,移动设备上通常是.MP4 相对于MPEG2来说 H264压缩率更高 所以相同信息量下H264压缩后体积更小 基本上一部高清电影如果是MPEG2压缩需要100G左右二H264编码方式下只需要25G左右。 相比MPG(MPEG1 VCD)来说压缩率大的...
什么是H264格式?
H264只是一种视频编码格式,不区分什么蓝光不蓝光。H.264:最大的优势是具有很高的数据压缩比率,在同等图像质量的条件下,H.264的压缩比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍;与MPEG-2和MPEG-4 ASP等压缩技术相比,H.264压缩技术将大大节省用户的下载时间和数据流量收费;并且具有高压缩比的...
h.265标准与h264标准有什么区别
一、H.265标准相较于H264标准,在视频压缩效率上有了显著的提升。二、1. 压缩效率:H.265标准相较于H264,采用了更先进的视频压缩技术。在相同的视频质量下,H.265能够比H264提供更高的压缩效率,这意味着使用H.265编码的视频文件大小更小,同时播放时需要的带宽也更低。2. 视频质量:尽管H.265...
大垄浦美: 首先要说明两个概念:“H264定义了音视频的压缩算法,AVI是一种封装格式.”封装格式就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中,也就是说仅仅是一个外壳,或者大家把它当成一个放视频轨和音频轨的文件夹也可以.然后就是AVI中既可以封装H264的视频,也可以封装MPEG2的视频
新丰县13038214298: mp4和mpeg4是一样格式的吗??? - ?
大垄浦美: MP4是一种文件格式,MPEG4是一种编码标准,两者的概念并不相同.Mp4是一个支持MPEG4的标准音频和视频文件,有许多文件格式支持MPEG4.Mp4和AVI就是其中之一.MP4是一套用于音频和视频信息的压缩编码标准,由国际...
新丰县13038214298: 如何使用ffmpeg将h264标准码流生成m3u8索引和ts段文件 - ?
大垄浦美: H.264,或称MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,JointVideoTeam)提出的高度压缩数字视频编解码器标准. 什么是H.264?H.264是一种高性能的视频编解...
新丰县13038214298: 关于音视频编码流格式和比特率的问题?
大垄浦美: 比特率这个词有多种翻译,比如码率等,表示经过编码(压缩)后的音频数据每秒钟需要用多少个比特来表示,而比特就是二进制里面最少的单位,要么是0,要么是1.比特率与音视频压缩的关系简单的说就是比特率越高音视频的质量就越好,...
新丰县13038214298: 我昨天下了些视频文件,属性却是mp3格式,请问mp3格式文件到底是一种什么样的文件? - ?
大垄浦美: MP3格式 开放分类: 电脑、音乐、格式、压缩、电脑格式MP3的全称是Moving Picture Experts Group Audio Layer III.简单的说,MP3...
新丰县13038214298: MPEG - 2编码的码流分为哪几个层次? - ?
大垄浦美: DVD层次.其他层次...
新丰县13038214298: 什么是MP3格式??
大垄浦美: 简单点就是文件名**.mp3的 MP3的全称是Moving Picture Experts Group Audio Layer III.简单的说,MP3就是一种音频压缩技术,由于这种压缩方式的全称叫MPEG Audio Layer3,所以人们把它简称为MP3.MP3是利用 MPEG Audio Layer 3 的...
新丰县13038214298: 关于视频码率的问题,怎么压缩不影响画质,减小体积? - ?
大垄浦美: 我使用了一阵狸窝,转换倒是快,但是,画质牺牲太严重,比如,《浓雾》这部片里,一到浓雾背景的时候,RMVB就比较清晰,没明显的层次感,而狸窝压缩后,如果按256KBP压缩,体积确实小很多,但是,浓雾的时候,会出现等高线一样...
新丰县13038214298: m2ts和mkv哪种格式清晰 - ?
大垄浦美: 嘛没啥可比性... m2ts封装来说和mkv没啥大差别... 也都是H264和AAC编码 也就是说m2ts可以无损转mkv,因为包含的音视频相同... 所以... 但是现在大多追求m2ts的都是蓝光原盘...类似有BD结构或者注明BDMV等等 mkv则相对于m2ts来源多得多,可能是后压制.. 如果这点看来,m2ts比mkv清晰 不过有些时候的后压的mkv更适合观看,m2ts更适合收藏.
新丰县13038214298: 在音视频中请问什么是ts流 ,es流,ps流 - ?
大垄浦美: 数字信号实际传送的是数据流,一般数据流包括以下三种: ES流:也叫基本码流,包含视频、音频或数据的连续码流. TS流:也叫传输流,是由固定长度为188字节的包组成,含有独立时基的一个或多个节目,适用于误码较多的环境. TS流...