jjzjj

H265视频码流结构分析

剑门微雨 2024-03-20 原文

目录

前言

H265码流结构

H265帧结构 

H265档次介绍


RTSP实时音视频开发实战课程:<RTSP实时音视频开发实战>

《YUV编码为H265视频流代码实现》链接:

https://edu.csdn.net/learn/38258/606134?spm=1003.2001.3001.4157

《H265视频流解码为YUV代码实现》链接:

https://edu.csdn.net/learn/38258/606144?spm=1003.2001.3001.4157

前言

       在音视频开发入门基础知识(视频入门篇)中介绍了H265的一些编码基础,本文会对H265编码后的视频流做一个详细的介绍。H264视频码流结构分析一文中对H264视频码流结构做了详细的分析,H265的视频码流结构和H264视频码流结构比较相似,建议阅读H264视频码流结构分析先了解下H264视频码流结构的特性和一些术语、概念。

H265码流结构

       H265的视频流中也是存在多个GOP,每一个GOP里面包含多个视频编码帧。H265支持的视频编码帧类型有IDR帧、I帧、P帧、B帧,这些帧类型的含义和H264码流的帧类型的含义是一样,作用也是一样,比如IDR帧和I帧都是帧内压缩编码,IDR帧是即时解码刷新帧,也是关键帧;P帧是前向参考帧,B帧是双向参考帧。

        H265的I帧或者IDR帧采用帧内编码,由于帧内压缩效率低,所以往往IDR帧/I帧比较大;如下图中的图像是H265的视频IDR帧的图像,可以看出IDR帧里面的每一个小块都是帧内编码块(橙色);图中上方的柱状图表示每个视频帧的大小,柱状图越高表示数据量越大,可以看出IDR帧(橙色)比较大。

       H265的P帧B帧也可以采用帧内压缩的方式来编码,不过主要还是靠帧间编码来提示压缩率的;如下图中的图像是H265的视频P帧的图像,可以看出P帧里面的小方块的大多是帧间编码块(蓝色块),还出了一个帧内编码块(橙色块)。

H265帧结构 

       H265每一个帧的组成和H264的构成一样,功能上分为NAL层(NetworkAbstraction Layer,网络提取层)和VCL层(VideoCoding Layer,视频编码层);H265的一帧编码图像中分为一个或者多个Nal 单元;每个NAL单元包含Nal 单元头和NAL 单元 Body;Nal 单元头由起始码和Nal Type组成。NAL 单元 Body通常是RBSP(Raw Byte Sequence Payload 原始字节序列载荷)数据 。如下图所示。H265的Nal Type和H264Nal Type有些许差异,如在IDR/I帧数据通常除了SPS、PPS还有VPS,如下图中红色字体VPS是H265视频流中增加的Nal Type。

VPS:Video Parameter Set,视频参数集;主要包含视频时域子层的最大数目,时钟周期计算相关参数等。

      与H264一样,H265可以通过Nal Type来判断当前Nal Unit的类型;如下图是Nal Unit 定义;在Nal Unit最开始的位置就是nal_unit_header,之后才是rbsp。

 下图是nal_unit_header的定义,共占用了16bit(2个字节);其中nal_unit_type表示的是一个NalUnit数据的类型,占前8bit的6个bit位;nal_unit_type的取值计算为(data[0] &0x7e)>> 1 。

 nal_unit_type字段定义如下图;如下图可以知道 nal_unit_type为32时候 Nal Unit是VPS;nal_unit_type为33时候 Nal Unit是SPS;nal_unit_type为34时候 Nal Unit是PPS;nal_unit_type为19-20时候 Nal Unit是IDR Slice;nal_unit_type为0-9,16-18,21的时候 Nal Unit是非IDR Slice;nal_unit_type为39-40时候 Nal Unit是SEI(视频增强信息)。实际上16-21都是I帧类型的数据。

          在H265视频帧中,对于非IDR 的Slice我们可以进一步解析slice_segment_header()中的slice_type;slice_segment_header()定义如下图。

下图是H265视频帧中slice_type的定义 ;

       下图是码流分析工具StreamAnalyzer展现出的VPS Nal Unit的bit构成,如下蓝色区域数字,起始码为00000001 ,起始码后面的40为十六进制数,(0x40&0x7e)>> 1得到nal_unit_type值是0x20,即十进制的32。  

      下图是码流分析工具StreamAnalyzer展现出的SPS Nal Unit的bit构成,如下蓝色区域数字,起始码为00000001 ,起始码后面的42为十六进制数,(0x42&0x7e)>> 1得到nal_unit_type值是0x21,即十进制的33。

      下图是码流分析工具StreamAnalyzer展现出的PPS Nal Unit的bit构成,如下蓝色区域数字,起始码为00000001 ,起始码后面的44为十六进制数,(0x44&0x7e)>> 1得到nal_unit_type值是0x22,即十进制的34。

      下图是码流分析工具StreamAnalyzer展现出的IDR slice Nal Unit的bit构成,如下蓝色区域数字,起始码为00000001 ,起始码后面的28为十六进制数,(0x28&0x7e)>> 1得到nal_unit_type值是0x14,即十进制的20。

      下图是码流分析工具StreamAnalyzer展现出的P slice Nal Unit的bit构成,如下蓝色区域数字,起始码为00000001 ,起始码后面的02为十六进制数,(0x02&0x7e)>> 1得到nal_unit_type值是0x1,即十进制的1。

H265档次介绍

       H265的早期标准里面的档次有MainMain 10, 和 Main Still Picture三种;

Main Profile:允许每个像素的位深度为 8 位,采样格式为 4:2:0;

Main10 Profile:将每个像素的位深度由 8 bit提升到了10bit,以更好的支持HDR视频。

Main Still Profile:支持单张静态图像进行编码;

        后来又增加了H265的档次,如[Main 4:2:2 12]支持12bit的像素格式,以及YUV422的采样格式;H265的各种档次下支持的功能如下图。水平是H265规范中支持的Profile,垂直是H265的编解码功能;Yes表示支持,No表示不支持。

有关H265视频码流结构分析的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  3. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  4. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  5. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  6. ruby-on-rails - 一般建议和推荐的文件夹结构 - Sinatra - 2

    您将如何构建一个简单的Sinatra应用程序?我正在制作,我希望该应用具有以下功能:“应用程序”更像是一个包含所有信息的管理仪表板。然后另一个应用程序将通过REST访问信息。我还没有创建仪表板,只是从数据库中获取东西session和身份验证(尚未实现)您可以上传图片,其他应用可以显示这些图片我已经使用RSpec创建了一个测试文件通过Prawn生成报告目前的设置是这样的:app.rbtest_app.rb因为我实际上只有应用程序和测试文件。到目前为止,我已经将Datamapper用于ORM,将SQLite用于数据库。这是我的第一个Ruby/Sinatra项目,所以欢迎任何和所有建议-我应

  7. ruby - 如何在 ruby​​ 中复制目录结构,不包括某些文件扩展名 - 2

    我想编写一个ruby​​脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"

  8. ruby - 如何更改此正则表达式以从未指定 v 参数的 Youtube URL 获取 Youtube 视频 ID? - 2

    目前我正在使用这个正则表达式从YoutubeURL中提取视频ID:url.match(/v=([^&]*)/)[1]我怎样才能改变它,以便它也可以从这个没有v参数的YoutubeURL获取视频ID:http://www.youtube.com/user/SHAYTARDS#p/u/9/Xc81AajGUMU感谢阅读。编辑:我正在使用ruby​​1.8.7 最佳答案 对于Ruby1.8.7,这就可以了。url_1='http://www.youtube.com/watch?v=8WVTOUh53QY&feature=feedf'url

  9. ruby-on-rails - 在 Rails 中存储(结构化)配置数据的位置 - 2

    对于我正在编写的Rails3应用程序,我正在考虑从本地文件系统上的XML、YAML或JSON文件中读取一些配置数据。重点是:我应该把这些文件放在哪里?Rails应用程序中是否有用于存储此类内容的默认位置?附带说明一下,我的应用程序部署在Heroku上。 最佳答案 我经常做的是:如果文件是通用配置文件:我在目录/config中创建一个YAML文件,每个环境有一个上层key如果我为每个环境(大项目)创建一个文件:我为每个环境创建一个YAML并将它们存储在/config/environments/然后我在加载YAML的地方创建了一个初始化

  10. ruby-on-rails -/usr/local/lib/libz.1.dylib,文件是为 i386 构建的,它不是被链接的体系结构 (x86_64) - 2

    在我的mac上安装几个东西时遇到这个问题,我认为这个问题来自将我的豹子升级到雪豹。我认为这个问题也与macports有关。/usr/local/lib/libz.1.dylib,filewasbuiltfori386whichisnotthearchitecturebeinglinked(x86_64)有什么想法吗?更新更具体地说,这发生在安装nokogirigem时日志看起来像:xslt_stylesheet.c:127:warning:passingargument1of‘Nokogiri_wrap_xml_document’withdifferentwidthduetoproto

随机推荐