原文地址
https://blog.csdn.net/h514434485/article/details/52064945

针对H264码流格式说明,网上已经有很多介绍了,最近也在看这个,这里根据自己理解,做个记录。

1、H264的功能分为两层:视频编码层(VLC,Video Coding Layer)和网络提取层(NAL, Network Abstraction Layer)。VLC数据即

编码处理的输出,它表示被压缩编码后的视频数据序列。在VCL数据传输或存储之前,这些编码的VCL数据先被映射或封装进NAL单

元。每个NAL单元包括一个原始字节序列负荷(RBSP, Raw Byte Sequence Payload)、一组对应于视频编码的NAL头信息。

这里说明下RBSP,EBSP,SODB。

SODB:(String of Data Bits)最原始的编码数据,无任何附加数据。

RBSP:在SODB的基础上增加了rbsp_stop_ont_bit(bit值为1)并用0按字节补位对齐。

EBSP:(Encapsulation Byte Sequence Packets)在RBSP的基础上增加了防止伪起始码字节(0x03)。

RBSP的基本结构是在原始编码数据的后面添加了结尾比特。一个bit”1”,若干比特”0”,以便字节对齐。

NAL单元序列如下:

图1

每个NAL单元包括NAL头+RBSP。

典型的RBSP单元如下:

现在来具体的说明下NAL头和RBSP。

NAL头结构为:

+—————+

|0|1|2|3|4|5|6|7|

+-+-+-+-+-+-+-+-+

|F|NRI| Type |

+—————+

NAL头说明:

针对Type的说明为:

然后我们根据一个实际的H264文件内容看下:

我们可以看到NAL的单元有SPS、PPS、SEI、IDR_SLICE等。NAL单元里面的头也显示了,头结构里面的nal_unit_type表示了RBSP是什么类型。这里要说明一点NAL_Size的大小是不包括startcode大小的。

接下来说明下起始码即刚刚上面提到的startcode。

起始码:如果NALU对应的Slice为一帧的开始,则用4字节表示,即0x00000001;否则用3个字节表示,即0x000001。

另外这里要用到上面提到的EBSP。为了使NALU的主体不包括起始码,在编码的时候每遇到两个字节(连续)的0,就插入一个字节0x03,以便和起始码相区别,解码时,则将相应的0x03删除掉。所以有时候NAL单元有可能是NAL头+EBSP组成。

NALU主体 编码时插入0x03

0x000000 >>>>>> 0x00000300
0x000001 >>>>>> 0x00000301
0x000002 >>>>>> 0x00000302
0x000003 >>>>>> 0x00000303

接下来对应刚刚的H264,其文件数据表示如下:

前面两个0x00000001对应PPS和SPS,第三个0x000001对应SEI。

2、接下来说说SPS、PPS和SEI。

SPS和PPS是用来初始化解码器的,没这些数据,视频数据是无法解析出来的。另外如果我们分析单独的H264文件,可以发现有的文件每个IDR帧前面都有PPS和SPS,有的只是开头才有。针对SPS和PPS,一般来说:

1)、如果是在直播的话,每个IDR帧前面都应该加上SPS和PPS,因为有的观众会中途进来观看。

2)、如果是本地稳定文件,可以在开头加上SPS和PPS,或者都加上,这个根据具体需要来。

另外说明下SEI,有的H264文件有SEI,有的则没有,这说明SEI对文件的播放并无太大影响。

SEI(Supplemental Enhancement Information):辅助增强信息。这里面可以存放一些影片简介,版权信息或者作者自己添加的一些信息。

参考文章:

http://www.cnblogs.com/skyseraph/archive/2012/04/01/2429384.html

http://blog.csdn.net/mandagod/article/details/51174680

H264视频码流格式浅析相关推荐

  1. H264视频码流结构分析

    目录 前言 H264码流结构 H264帧结构 H264档次介绍 RTSP实时音视频开发实战课程:<RTSP实时音视频开发实战> <YUV编码为H264视频流代码实现>链接: h ...

  2. 【FFmpeg学习】H264 视频码流分析

    1. H264编码分层 NAL层:(Network Abstraction Layer,视频数据网络抽象层): 它的作用是H264只要在网络上传输,在传输的过程每个包以太网是1500字节,而H264的 ...

  3. H265视频码流结构分析

    目录 前言 H265码流结构 H265帧结构 H265档次介绍 前言 在音视频开发入门基础知识(视频入门篇)中介绍了H265的一些编码基础,本文会对H265编码后的视频流做一个详细的介绍.H264视频 ...

  4. <整理总结>H264/265码流数据包格式分析(带mp4v2封装H264/265为MP4的源码示例)

    H264/265码流数据包格式分析 前言: 一.H.264码流解析 I帧P帧B帧说明: 二.H.265码流解析 三.主要源码 前言: 最近在学习使用MP4v2将H264/H265码流以及AAC音频封装 ...

  5. 【H264/AVC 句法和语义详解】(二):h264码流格式与NALU详解一

    上一篇中,我们站在句法元素(或称语法元素)的角度,介绍了H.264的句法和语义,和句法元素的分层结构.在这篇中,我们更进一步,从比特的角度出发,来探索h264码流的组成.通过这篇的学习,我们会初步具备 ...

  6. 码流格式: Annex-B, AVCC(H.264)与HVCC(H.265), extradata详解

    1.前言 介绍H.264结构的文章铺天盖地,无责任翻译.无责任转载以及部分经验之谈(目前搜索最靠前的一篇实际是对stackoverflow上答案的翻译..链接后面给出了),所以缺的不是资料,是叙述准确 ...

  7. H264/H265码流类型

    文章目录 H.264码流 H.264码流格式 Annex B AVCC H.265码流 H.264码流 H264中,NALU类型1-5为视频帧,其余则为非视频帧.在解码过程中,我们只需要取出NALU头 ...

  8. linux 摄像头 音频,调用宇视摄像机SDK获取IPC的音视频码流

    调用宇视摄像机SDK获取IPC的音视频码流 2020年07月13日 | 萬仟网网络运营 | 我要评论 通过调取宇视摄像机SDK,获取的音视频码流,其格式为标准的h264 over rtp或h265 o ...

  9. 视音频数据处理入门:H.264视频码流解析

    ===================================================== 视音频数据处理入门系列文章:视音频数据处理入门:RGB.YUV像素数据处理视音频数据处理入门 ...

最新文章

  1. Random类(Java中的随机类)
  2. Eclipse tomcat Web页面调试
  3. python的os.path.join
  4. Oracle sql如何把毫秒转为日期,sql – 将毫秒转换为时间戳
  5. Kali安装magescan评估工具
  6. 前端实现连连看小游戏(1)
  7. 【CSS基础】实现 div 里的内容垂直水平居中
  8. CF653F. Paper task
  9. beanutil 批量copy_BeanUtils.copyProperties 需要getset方法支持
  10. java端到端_Java应用程序性能监控:复杂分布式应用程序的端到端性能
  11. ●BZOJ 1855 [Scoi2010]股票交易
  12. 【计算机毕业设计】基于SpringBoot的物流管理系统
  13. java opencv 之车辆识别
  14. 网上书城_前端动态加载类别and书籍显示
  15. amd支持服务器内存,AMD专用内存为什么只能在AMD平台使用?与普通内存有什么区别?...
  16. java stack长度_Java Stack size()用法及代码示例
  17. 如何在YouTube上制作播放列表
  18. 计算机英语单词怎么读,英语单词read怎么读,read的音标是什么,read是什么意思 - 音标网...
  19. 编译原理:LL(1)文法 语法分析器(预测分析表法)
  20. loadrunner压测小程序

热门文章

  1. 面向企业服务,网易智企的深耕与拓进
  2. Android使用FFmpeg开发播发器(一)编译FFmpeg
  3. c++ Prime Plus 第五章 循环和关系表达式
  4. 如何通过X1使电脑上网
  5. 联想E460重装系统
  6. 20P36 Premiere预设200个转场效果文字标题音效合集包
  7. 耳机插入电脑为啥没声音,解决方案
  8. Epub360教你招聘H5页面设计与制作
  9. CarSIm2016安装过程
  10. SyntaxError: invalid syntax 诡异的错误