网络分层结构

和H264/AVC结构类似,H265/HEVC也采用了视频编码层(video code layer ,简称VCL)和网络适配层(network abstract layer,简称NAL).VCL层包含了视频压缩的数据, NAL主要负责对数据的压缩数据进行划分和封装,保证数据在磁盘上保存和网络上进行传输。

和h264的码流结构一样,也是通过启始码(0x000001或者0x00000001)进行分割压缩数据,每一个称为NAL单元(NAL Unit,简称NALU)。NALU有不同的类型,主要是对数据内容进行区分。

对于一个码流文件来说,和h264一样,有一系列的NALU的类型定义,可以分为VPS,SPS,PPS,SEI,I帧,P帧 6种类型。码流结构如下所示:

启始码+VPS+启始码+SPS+启始码+PPS+启始码+SEI+启始码+I帧+启始码+P帧+启始码+P帧+.....

如上就是一个图像系列的组成,为什么这么说呢? 一般我们在网络上发送数据,比如采集端一般在发送压缩数据的I帧前先发送VPS,SPS,PPS。解码端不可能先启动后等着发送端数据到来吧,只有解码器拿到VPS,SPS,PPS后才可以解码H265的数据。VPS,SPS,PPS,SEI,一个I帧,一个P帧都可以常委一个NALU。

从上面可以看到h265比h264多了一个VPS,VPS是视频参数集。

我们这里看一下经过h265编码器编码后的码流文件,截取文件开头的数据,
因为h265码流最开始永远是VPS,SPS,PPS,可能含有SEI,后面接着是I帧P帧数据。

16进制打开文件如下:

0000 0001 4001 0c01 ffff 0160 0000 0300 // 4001
b000 0003 0000 0300 5aac 0900 0000 0142 // 4201
0101 0160 0000 0300 b000 0003 0000 0300
5aa0 0442 00f0 77e5 aee4 c92e a520 a0c0
c05d a142 5000 0000 0144 01c0 e30f 0330 // 4401
840a 0000 0001 2601 af0b e075 8d53 b010 // 2601
af65 bfb4 0b53 823d e91c ad66 f973 ce21
5d92 9227 9159 3dc6 2cae 5adf 4cda f9b5
6105 3165 97cd 64cd f04d 09d5 5e10 d231
// ...省略其它数据
2f04 c9cc 1e01 700a 0000 0001 0201 d08f // 0201
// ...省略其它数据

单元NALU结构

可以看到上面的数据和h264一样,H265的NALU的结构也是:启始码+ NALU头+NALU数据。如果NALU对应的Slice为一帧的开始(即视频流的首个NALU)就用0x00000001,否则就用0x000001。

  • 启始码:是一个固定值4个字节00 00 00 01(十六进制)或者3个字节00 00 01(十六进制)
  • NALU的头大小为2个字节,第1为是0,第2-7位是NALU的类型,表示该NALU的数据内容是什么类型的,是VPS,SPS,PPS,SEI,I帧还是P帧。第8-15位是1
  • NALU的数据就是编码器编出来的图像信息或者图像压缩数据了

NALU的nal_unit_type官方文档所示:

可以上面的文件数据片段中可以计算出6种NALU的头类型nal_unit_type,取2个字节的2-7位即可。计算方法:

// 0x7E的二进制的后8位是 0111  1110int naluType = (byteOffset & 0x7E) >> 1

byteOffset就是00 00 00 01或者00 00 01后面的2个字节。

  • VPS(视频参数集)NALU的头值为0x4001(十六进制),取出2-7位(40 & 0x7E)>>1 =32(十进制)
  • SPS(序列参数集)NALU的头值为0x4201(十六进制),取出2-7位(42 & 0x7E)>>1 =33(十进制)
  • PPS(图像参数集)NALU的头值为0x4401(十六进制),取出2-7位(44 & 0x7E)>>1 =34(十进制)
  • SEI(补充增强信息)NALU的头值为0x4e01(十六进制),取出2-7位(4e & 0x7E)>>1 =39(十进制)
  • I帧 NALU的头值为0x2601(十六进制),取出2-7位(26 & 0x7E)>>1 =19(十进制)
  • P帧 NALU的头值为0x0201(十六进制),取出2-7位(02& 0x7E)>>1 =1(十进制)

NALU的类型官方文档所示:

RBSP的结构

H265的 RBSP(raw byte sequence payload)和H264的一样。

NAL根据送压缩数据的规则,可以封装称不同的NALU, NALU包含VPS,SPS,PPSl类型信息,还包含视频片(Slice)的压缩数据,包含压缩的NALU被称为VCLU(VCL NALU),包含其它信息的压缩数据的NALU,则被称为non-VCLU(non-VCL NALU)。

H265下的NALU包含两部分数据结构:NALU头(header)和负载(payload),NALU头长度为固定的2字节,反应NALU的内容特征,而NALU的负载长度为整数字节,包含视频压缩后的原始字节序列负载RBSP(raw byte sequence payload)。RBSP是对视频 编码后的原始比特流片段SODB(string of data bits)进行添加尾部(添加比特1,以凑足整字节)的包装。

同样在H265中,为了避免字节流片段和NALU的启起码及结束码发生冲突,需要对RBSP的字节流进行冲突处理0x3,经过处理后的RBSP才可以直接作为NALU的负载信息,才可以进程磁盘保存和网络传输。

h264码流分析:https://blog.csdn.net/www_dong/article/details/125686721

音视频学习(十一)——H265视频码流相关推荐

  1. Android音视频【十一】视频混音

    人间观察 其实人这一辈子 真的遇不到几个真心对你好爱你的人 如果有幸能牵手 那就别并肩 好好的 别老是冷冰冰 说反话 简介 短视频的编辑功能有很多,比如:添加背景音乐,剪切,拼接视频/音频,特效,贴纸 ...

  2. 音视频学习笔记1--音视频基础知识(1)

    音视频基础知识 1 音视频开发是什么? 2 音视频数据处理流程 2.1 音视频数据采集 2.2 封装与解封装 2.3 音视频输出 2.4 音视频同步 3 视频中的基础概念 3.1 视频码率 3.2 视 ...

  3. 音视频学习(十)——ps流

    1. 简介 PS的封装格式需要支持MPEG2/MPEG4/H.264等视频和MPEG系列的音频,支持在多个层次加入私有数据,方便解码.拖动和加入延时,同时考虑到标准的PS.TS 和 RTP 封装方式间 ...

  4. 音视频学习之rtsp推拉流学习2(流媒体服务器ZLMediaKit)

    公司项目需要实现一个只是rtsp推流和rtsp拉流的业务机制,据说ZLMediaKit能满足rtsp推拉流的相关业务. 对ZLMediaKit流媒体服务器进行安装以及了解. 0:从开源库Readme中 ...

  5. 深入讲解音视频编码原理,H264码流详解——手写H264编码器

    音视频高手课08-H264 I帧 P帧 B帧及手写H264编码器 1 三种帧的说明 1.I 帧:帧内编码帧,帧表示关键帧,你可以理解为这一帧画面的完整保留:解码时只需要本帧数据就可以完成(因为包含完整 ...

  6. H264/H265/YUV码流分析工具推荐(一)

    1.CodecVisa(跨平台:H264/H265...) http://www.codecian.com/downloads.html2.H264BSAnalyzer(H264/H265) http ...

  7. WireShark导出H265/HEVC码流,使用h265_export.lua插件

    H265聚合包(APS)处修改: local function process_stap_a(stream_info, h265, timestamp, seq) twappend("str ...

  8. H265/HEVC视频分层码流分析语义元素解释

    H265/HEVC视频分层码流分析语义元素解释 H265分层结构 H265码流结构 Ffmpge 抽取H264,H265码流的命令 视频参数集VPS 序列参数集SPS(Sequence Paramet ...

  9. mp4box 封装H265码流

    一般我用HM编码出来的H265码流是NAL封装的裸码流, 但播放器处理的往往是有封装的码流.之前,我们傻傻地在播放器中间件里面搞了一套处理裸码流的parser, 随着各种需求的增多,感觉这是东西有些多 ...

  10. H265码流结构分析

    文章目录 1 准备工作 1.1 H265视频文件 1.2 参考文档 1.3 参考博文 2 分析 2.1 NALU type 2.1.1 H264 2.1.2 H265 2.2 实例分析 最近了解了一下 ...

最新文章

  1. Android开发之SpannableString具体解释
  2. let const缓存for循环的中间变量
  3. 指令寻址方式与数据寻址方式
  4. dockerfile 安装mysql_dockerfile构建mysql镜像
  5. C++(STL):07---vector之使用方式和常规用法
  6. How to get Intellisense for Web.config and App.config in Visual Studio .NET?(转载)
  7. Markdow简单介绍
  8. 论文阅读笔记(十四)——基于大比例圈养大熊猫图像的大熊猫识别研究
  9. 贴花纸怎么贴_地砖保护膜怎么贴—怎么贴地砖保护膜
  10. MATLAB之ODE
  11. java 学生签到考勤系统_学生考勤管理系统 用了ecplise编程实现Java+jsp+mysql数据库实现对学生的考勤管理签到和教师查看登陆注册以及一套完整的增删改查 - 下载 - 搜珍网...
  12. Foxit PDF Creator注册码
  13. c语言程序中文复制到word变乱码,怎么复制C程序代码到Word不会有乱码,不会有乱字等情况...
  14. 软件工程期末笔记整理
  15. mysql索引的常识
  16. java全栈开发主要工作内容,java全栈工程师
  17. 微信每日早安推送 Windows版
  18. win10删除文件时显示文件已经在另一个程序中打开,无法删除
  19. 锐龙4750u和4800u的区别
  20. 科研写作——常见句式(一)

热门文章

  1. c语言旅馆信息管理设计,C语言旅馆信息管理系统资料整理(24页)-原创力文档...
  2. HMI-37-【节能模式】中心仪表实现
  3. 异常的处理(try.....catch )
  4. 抽屉原理(鸽巢原理)和拉姆齐定理
  5. Linux TCP拥塞控制的undo图解
  6. 以不教民战,是谓弃之
  7. html 如何给图片打标签,图文详解HTML页面中添加图片的三种方法
  8. phpmyadmin登录MySQL密码_phpMyAdmin配置登录用户名与密码教程
  9. Apache Avro是什么?
  10. 单片机供电及掉电保护