本人因为近期在读取h264文件的时候,遇到怎样读取完整一帧数据的问题。通过使用elecard stream analyzer工具,以及结合《新一代视频压缩编码标准--H264/AVC》(第二版)书。并在网上查找总结例如以下:

首先NAL句法,片头句法以及nal_unit_type语义必须知道:

以上两图截自《新一代视频压缩编码标准--H264/AVC》(第二版)

简单的区分帧的方法就是读取文件的时候与0x00 0x00 0x00 0x01比較。假设相等觉得是一个片。再读取一个字节就相应表6.1的forbidden_zero_bit(1bit)。nal_ref_idc(2bit),nal_unit_type(5bit)。nal_unit_type值依据表6.20能够确定该帧类型,对于7,8是没有first_mb_in_slice,能够一直读到下一个0x00 0x00 0x00 0x01这之间的数据都是參数集数据。

对于1,5都是有first_mb_in_slice而且每一帧第一片的first_mb_in_slice都是0,这对于分成多片的一帧数据的获取是非常实用的。

以下是指数哥伦布码的解析:来自http://blog.csdn.net/simongyley/article/details/8517817

解析k阶指数哥伦布码时。首先从比特流的当前位置開始寻找第一个非零比特,并将找到的零比特个数记为leadingZeroBits,然后依据leadingZeroBits计算CodeNum。用伪代码描写叙述例如以下:

first_mb_in_slice是须要对h264通过ExpGolomb编码过的一串2进制数进行ExpGolomb解码得到。通过在网上多方查找并结合h264的文件分析,最终找到了计算方法,如今跟大家分享一下。有不正确的地方欢迎指正。

I帧情况:

例如以下图所看到的:

88 80 = 1000 1000 1000 0000      如果阶数为0,那么leadingZeroBits=0, CodeNum(first_mb_in_slice) = 1-1+0=0

06 62 = 0000 0110 0110 0010      如果阶数为0。那么LeadingZeroBits=5, CodeNum(first_mb_in_slice)=2EXP(5)-2EXP(0)+10011(2进制)=32-1+19=50

p帧情况:

例如以下图所看到的:

9A 00 = 1001 1010 0000 0000      如果阶数为0,那么leadingZeroBits=0, CodeNum(first_mb_in_slice) = 1-1+0=0

03 29 = 0000 0011 0010 1001      如果阶数为0,那么LeadingZeroBits=6, CodeNum(first_mb_in_slice)=2EXP(6)-2EXP(0)+100101(2进制)=64-1+37=100

事实上对于0阶而言,最简单的方法就是推断该字节第一个bit是否为1,假设是1。CodeNum(first_mb_in_slice),肯定为0,就是一帧的第一片。

原理讲解完成,希望对大家有所帮助。详细计算first_mb_in_slice的代码网上应该比較多,也能够參考ffmpeg的。

h264 ES流文件通过计算first_mb_in_slice区分帧边界的更多相关文章

  1. (转)MP4文件两种格式AVC1和H264的区别及利用FFMPEG demux为h264码流事项

    出自:http://www.mworkbox.com/wp/work/314.html 2013-05-04 MP4的视频H264封装有2种格式:h264和avc1,对于这个细节,很容易被忽略.笔者也 ...

  2. RTP协议全解析(H264码流和PS流)

    转自:http://blog.csdn.net/chen495810242/article/details/39207305 写在前面:RTP的解析,网上找了很多资料,但是都不全,所以我力图整理出一个 ...

  3. (转)RTP协议全解(H264码流和PS流)

    写在前面:RTP的解析,网上找了很多资料,但是都不全,所以我力图整理出一个比较全面的解析, 其中借鉴了很多文章,我都列在了文章最后,在此表示感谢. 互联网的发展离不开大家的无私奉献,我决定从我做起,希 ...

  4. RTP协议全解(H264码流和PS流)

    写在前面:RTP的解析,网上找了很多资料,但是都不全,所以我力图整理出一个比较全面的解析, 其中借鉴了很多文章,我都列在了文章最后,在此表示感谢. 互联网的发展离不开大家的无私奉献,我决定从我做起,希 ...

  5. ffmpeg学习(二) 通过rtsp获取H264裸流并保存到mp4文件

    本篇将使用上节http://www.cnblogs.com/wenjingu/p/3977015.html中编译好的库文件通过rtsp获取网络上的h264裸流并保存到mp4文件中. 1.VS2010建 ...

  6. 关于对H264码流的TS的封装的相关代码实现

    1 写在开始之前 在前段时间有分享一个H264封装ps流到相关文章的,这次和大家分享下将H264封装成TS流到相关实现,其实也是工作工作需要.依照上篇一样,分段说明每个数据头的封装情况,当然,一样也会 ...

  7. H264码流打包分析(精华)

    H264码流打包分析 SODB 数据比特串-->最原始的编码数据 RBSP 原始字节序列载荷-->在SODB的后面填加了结尾比特(RBSP trailing bits 一个bit“1”)若 ...

  8. H264码流解析及NALU

    ffmpeg 从mp4上提取H264的nalu http://blog.csdn.net/gavinr/article/details/7183499 639     /* bitstream fil ...

  9. H264码流中SPS PPS详解<转>

    转载地址:https://zhuanlan.zhihu.com/p/27896239 1 SPS和PPS从何处而来? 2 SPS和PPS中的每个参数起什么作用? 3 如何解析SDP中包含的H.264的 ...

随机推荐

  1. [Markdown]纯文本标记语言MarkdowPad2--MD语法知识

    ##1.标题 代码 注:# 后面保持空格 # h1 ## h2 ### h3 #### h4 ##### h5 ###### h6 ####### h7 // 错误代码 ######## h8 // ...

  2. Java高级架构师(一)第04节:Git基本原理和安装配置使用

    关于Git的常规操作---没有什么特别难点,只做截图记录.

  3. ztree jquery 树 控件

    插件地址:http://www.ztree.me 数据:[{"id":1,"pId":-1,"name":"根目录"}, ...

  4. 关于java的关键字 transient

    我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,Java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable ...

  5. python安全编程

    ##入门 这将是第一个一系列关于python编程的博客文章.python是一门非常强大的语言,因为它有信息安全社区的支撑.这意味着很多工具都是由python编写并且可以在脚本中调用很多模块.使用模块的 ...

  6. nagios监控redis

    nagios是非常强大的监控工具,但是它本身没有监控redis的功能 但是网上有很多大神写了监控redis的插件,比较热门的使用perl写的check_redis.pl 但是由于我们监控mongodb ...

  7. 面试题:判断两个字符串是否互为回环变位(Circular Rotaion)

    题干:   如果字符串 s 中的字符循环移动任意位置之后能够得到另一个字符串 t,那么 s 就被称为 t 的回环变位(circular rotation).   例如,ACTGACG 就是 TGACG ...

  8. 依据出生日期Date 计算年龄

    依据出生日期计算年龄 public class DateGetAge { public static int getAge(Date birthDay) throws Exception { Cale ...

  9. 使用curl向Solr导入json文件(Windows、Linux均可)

    Linux环境下: 1.进入需要导入的文件所在路径 2.执行: curl "http://IP:8983/solr/目标集合名/update?commit=true" --data ...

  10. spark完全分布式集群搭建

    最近学习Spark,因此想把相关内容记录下来,方便他人参考,也方便自己回忆吧 spark开发环境的介绍资料很多,大同小异,很多不能一次配置成功,我以自己的实际操作过程为准,详细记录下来. 1.基本运行 ...