H264码流结构讲解

所谓的码流结构就是指:视频经过编码之后所得到的数据是怎样排列的,换句话说,就是编码后的码流我们该如何将一帧一帧的数据分离开来,哪一块数据是一帧图像,哪一块是另外一帧图像,只要了解了这个,后面的事情就好办了。

1.H264帧的定义

        在H264编码中有I帧,p帧和B帧。每一帧都相当于一张静止的图像。在实际的码流传输中会利用编码器来压缩图像以减少视频的体积,其中I帧、P帧、B帧最为常见。

I 帧: I 帧通常又称之为内部画面,它通常是视频编码的第一帧。它的最大特点是自带一个完整的图像信息,在解码的过程中只需要解码本帧就可以完整地提取出一个完整的画面。假设一个视频中丢失了I 帧,则整个视频则会处于黑屏状态,后面的视频则无法正常播出。由此可见, I 帧在视频编码中扮演着相当重要的角色。但是它也有自身的缺点,那就是I 帧的体积比较大,假设在传输视频中全部采用 I 帧去传输,那整个网络链路都承受着巨大的压力。 所以,I 帧就要配合 P 帧、 B 帧等进行数据的传输。
P 帧: P 帧又称之为前向参考帧,此帧的特点是需要参考前一帧的图像信息才可以正确把图像解码出来。 P 帧指的是这一帧和前一帧的差别,并通过将图像序列中已经编码后的冗余信息充分去除来压缩传输数据量的编码图像。
B 帧: B 帧也称之为双向参考帧, B 帧的特点是以前面的帧 (I 帧或者 P ) 或者后面的帧 ( 也是 I 帧、 P ) 作为参考帧找出 B 帧的预测值,并且取预测差值和预测矢量进行传送。所以在拉流端解码B 帧的时候不仅需要获得前面的缓存视频,还需要获得后面的缓存视频才能够正常解码 B 帧。所以, B 帧虽然压缩率更高,但是更消耗CPU 资源

2.GOP(I帧间隔)

     GOP 指的是两个 I 帧之间的距离,在一个 GOP 包含了一组连续的图片。在一个 GOP 中包含了 I 帧、 P 帧、 B 帧,直到下一个 I 帧的出现,一个 GOP 才算结束。
    通常来说,I 帧所占用的字节和体积大于 P 帧、而 P 帧所占用的字节大于 B 帧。所以在码率不变的情况下,可以调整 GOP 的长度去改善画质, GOP的长度越长,所得到的P 帧和 B 帧更多,画面的质量和细节就会更好。

 

3.Slice片

        一帧图像可以分成若干片,每一片又可分成若干个宏块。宏块是视频的最小单位。

        为了并行编码,所以引入了片的概念,所谓的并行编码就是把一帧图像分成几个片,每个片相互独立进行编码。

4.H264的码流格式

        H264的码流格式可以分为两类,不同的码流格式,对于编码器的处理方式不同

        1.Annexb格式:也叫字节流格式,字节流格式使用起始码来表示一个编码数据的开始,起始码不是图像数据的一部分,只起到一个分隔图像的作用。大部分的编码器默认输出的是字节流格式的,字节流格式也叫做H264裸流。字节流格式的基本数据单元是NAL(也叫NALU)单元,为了从字节流中提取出NAL单元,协议规定,每个NAL前必须加上一个开始码

0x00000001(4字节)或0x000001(三字节)

        这里要注意一下,NAL中的h264数据也有可能包含0x00000001或0x000001,一般对NAL的这种情况会做出如下的处理:
        (1)00 00 00 修改成00 00 00 03 00

        (2)00 00 01 修改成00 00 00 03 01

        (3)00 00 02 修改成00 00 00 03 02

        (4)00 00 03 修改成00 00 00 03 03

           即只能出现连续两个字节的 00 00

 

 所以基于字节流的H264裸流=起始单元+NALU + 起始单元 + NALU +............(其实这个起始单元也是NALU的一部分,为了理解所以写成这样)

   2.MP4格式,MP4格式没有起始单元,但是MP4编码中使用了4字节长度作为标识,用来表示编码数据的长度。每次读取4字节数据计算出编码数据的长度,然后取出编码数据,再读取4字节,计算出数据长度,然后取出数据,这样一直计算下去就可以取出编码数据了。

5.基于字节流的H264裸流的组成结构

       H264裸流分层可以分成两层,一层是VCL层(视频编码的底层),另外一层是NAL层(网络提取层也叫NALU),VCL层包含的是H264的视频内容,NALU负责的是把网络视频进行打包和传输,对于开发人员我们一般是不关心CVL层的,我们关注的重点一般都是NALU

        结构如图所示:

            SODB(数据比特串):就是VCL层,是最基本的编码数据,没有包含任何的附加信息。

    RBSP(原始字节序列载荷):在SODB的后面加上了结尾比特,一个bit1和若干个bit0,用来字节对齐

    EBSP(扩展字节序列载荷):在RBSP的基础上添加了仿效字节(0x03).这样做的原因上面也介绍过,因为NALU的起始数据是 00 00 00 00 01或 00 00 01,防止NALU中的其他数据也出现 00 00 00 01 或 00 00 01,所以NALU会把连续的两个 00 00后插入一个0x03,在解码时,会自动的把加入的0x03丢掉,这个操作叫做脱壳操作。

通常来说,一个原始的 H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload] 。三部分组成,其中 Start Code 用于标示这是一个 NALU 单元的开始,必须是"00 00 00 01" "00 00 01" ,具体的如下图:

如图所以,画框的都是一帧NALU单元,我们介绍一下NALU数据的特殊意义:

        00 00 00 01 06 05这是SEI数据,是视频的附加信息,包含了用户的自定义信息,比如时间戳,字幕和弹幕信息等。SEI信息一般放在编码图像之前,很多时候SEI是可以忽略的

        00 00 00 01 67这是SPS数据,这指的是序列参数集,它保存了一组编码视频序列的全局参数。编码视频序列指的是原始数据经过编码后组成的一系列序列集。

        00 00 00 01 68PPS数据,这指的是图像的参数集,主要用于保存图像序列集中一个或多个独立的图像,一般情况下,配合SPS和PPS都是H264开头的两个NALU头。

        00 00 00 01 65IDR数据,IDR指的是H264一帧完整的图像数据,也就是常说的关键帧。

        所以一个标准的H264码流结构一般是:SEI+SPS+PPS+IDR

6.I帧和IDR帧的区别和联系

        IDR属于I帧,但是I帧不一定是IDR帧。只有IDR帧,才有SPS和PPS。解码器收到IDR帧时,将缓存清空;而收到I帧不会清空缓存。也就是说,对某个IDR帧之后的帧,解码器不会参考这个IDR帧之前的任何帧做解码。对某个I帧之后的帧,解码器可能会参考这个I帧之前的帧做解码。

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/413848.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3是如何避免样式污染的?

众所周知,在vue中使用scoped可以避免父组件的样式渗透到子组件中。使用了scoped后会给html增加自定义属性data-v-x,同时会给组件内CSS选择器添加对应的属性选择器[data-v-x]。本文讲一下vue是如何给CSS选择器添加对应的属性选择器[data-v-x]。注&#xf…

JVM堆内存空间(heap)

在Java程序运行时,系统运行过程中产生的大部分实例对象以及数组对象都会被放到堆中存储。 默认情况下,如果不通过参数强制指定堆空间大小,那么JVM会根据当前所在的平台进行自适应调整,起始大小默认为当前物理机器内存的1/64&…

基于ssm+vue的汽车租赁管理系统

摘要 随着移动应用技术的发展,越来越多的用户借助于移动手机、电脑完成生活中的事务,许多的传统行业也更加重视与互联网的结合,以提高商家知名度和寻求更高的经济利益。针对传统汽车租赁系统,租赁信息、续租信息等问题&#xff0c…

【算法每日一练及解题思路】找出模式匹配字符串的异位词在原始字符串中出现的索引下标

【算法每日一练及解题思路】找出模式匹配字符串的异位词在原始字符串中出现的索引下标 一、题目:找出模式匹配字符串的异位词在原始字符串中出现的索引下标 二、举例: 两个字符串原始字符串initStr123sf3rtfb,模式匹配字符串regxf3s,找到模…

区域生长算法详解与Python实现

图像分割是计算机视觉中一个重要的任务,区域生长算法是其中的一种常见方法。本文将详细介绍区域生长算法的原理,并通过Python代码实现,带你一步步理解它的实际应用。 1. 区域生长算法简介 区域生长算法是一种基于像素相似性进行图像分割的方…

【方法论】读论文的三个层次,四个阶段,十个问题

学习资料 - 沈向洋十问 如何正确阅读一篇科研论文 阅读理解作者的意图,不同的阅读需求对应不同的阅读层次(速读,精读,研读) 速读:标题,引言,摘要,结论 文章要解决什么…

并发编程之定时任务定时线程池

并发编程之定时任务&定时线程池-CSDN博客

Upload-LABS通关攻略【1-20关】

Pass-01 第一关是前端JS绕过 上传一个php文件显示只能上传特定后缀名的文件 这里将1.php改为1.jpg直接进行抓包,在数据包中将jpg改为php放行 文件上传成功,邮件图片新建页面打开 可以访问到1.php文件,则一句话密码上传成功 使用蚁剑 进行连接…

六、vue进阶知识点

一、scoped解决样式冲突 默认情况:写在组件中的样式会 全局生效→ 因此很容易造成多个组件之间的样式冲突问题。 1.全局样式:默认组件中的样式会作用到全局 2.局部样式:可以给组件加上 scoped 属性,可以让样式只作用于当前组件scoped原理? 1.当前组件内标签都被添加 data-v-…

智慧猪场实训中心解决方案

一、引言 随着科技的飞速发展,传统养猪业正经历着前所未有的变革。为了提高养猪效率、降低生产成本并保障猪只健康,智慧养猪场的概念应运而生。唯众特此推出《智慧猪场实训中心解决方案》,旨在通过先进的技术与管理手段,为养猪业培…

RTA-OS Port Guide学习(一)-基于S32K324 OS

文章目录 前言OS Port的安装Port CharacteristicsParameters of ImplementationConfiguration ParametersStack used for C-startup(SpPreStartOS)Stack used when idle (SpStartOS)Stack overheads for ISR activation (SpIDisp)Stack overheads for ECC tasks (SpECC)Stack o…

uniapp uni-popup底部弹框留白 底部颜色修改 滚动穿刺

做底部弹框的时候,可能出现以下场景需要处理。 一、出现底部留白不是白色,需要修改颜色的时候: 1、如果弹框不需要圆角效果,则在uni-popup加上背景色就行,弹框是个直角样式: 2、如果需要圆角效果&#xff0…

vue3本地运行错误集

1、解决报错ValidationError: Progress Plugin Invalid Options问题 ValidationError: Progress Plugin Invalid Optionsoptions should NOT have additional propertiesoptions should NOT have additional propertiesoptions should NOT have additional propertiesoptions …

「Claude3.5」全面超越「gpt-4o」,我用它做了个贪吃蛇,玩了一整天!

大家好,我是凡人。 就在昨天晚上Anthropic在X上连续发了4条动态来高调宣布他们的Claude 3.5 Sonnet中杯的版本已经全面向公众开放使用,大批的技术博主连夜测试,纷纷给出的不低的评价。 而这还仅仅是开胃小菜,官方宣称今年晚些时候…

苹果mac数据恢复概率大吗 mac数据恢复专业软件哪个好用

一般情况下,当我们把电脑中的数据删掉后,都会保存在回收站里面,但如果回收站被清空了或者数据在回收站中没有找到的话,那么,之前被删掉的数据还能恢复吗?恢复的概率有多大呢? 答案是可以的&…

【微服务】限流、熔断和降级(持续更新中~)

1、限流 1.1 什么是限流 限流(Rate Limiting)是一种常用的技术手段,用于控制系统对资源的访问速率,确保系统的稳定性和可靠性。在分布式系统、Web服务、API接口等场景中,限流尤为重要。通过限制请求的频率或数量&…

每天五分钟计算机视觉:人脸识别网络FaceNet

本文重点 在前面的课程中,为了解决人脸识别的问题,我们学习了Siamese神经网络。本文我们学习另外一种人脸识别网络模型FaceNet。 论文 FaceNet: A Unified Embedding for Face Recognition and Clustering FaceNet概述 FaceNet是谷歌在CVPR 2015上提出的一种深度学习模型,…

【Redis】Redis 持久化 AOF、RDB—(七)

目录 一、AOF 日志二、RDB 内存快照 Redis 一旦服务器宕机,内存中的数据将全部丢失,从后端数据库恢复这些数据,对数据库压力很大,且性能肯定比不上从 Redis 中读取,会拖慢应用程序。所以,对 Redis 来说&…

Linux awk案例

目录 1. 查询时间超过2000毫秒的请求2. 查询指定列组合出现的次数3. 统计所有文件的大小4. 获取大于指定大小的文件名,并按照从大到小排序5. grep指定字段后,使用awk列转行6. 查询第四个字段等于指定值的内容 1. 查询时间超过2000毫秒的请求 ✅log: 202…

初等数学几百年重大错误:N各元n的对应n+1的全体是N的真子集N+——百年病态集论的症结

黄小宁 数学图可是“离散”的点组成的点集N{0,1,2,…,n,…0}(各数是点的坐标)。设本文所说集合往往是元不少于两个的集。定义:若数(点&#xff09…