本人因为近期在读取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. STL之priority_queue2

    描述 使用STL中的优先队列,将一个字符串中的各个字符按照ASCII从小到大顺序排列. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. int main() { int n; cin&g ...

  2. iOS开发笔记_4自定义TabBar

    新博客:http://www.liuchendi.com 好多APP都使用的是自定义的TabBar,那这个功能应该如何实现呢?首先应该解决的问题就是,加载NavigationController的时候 ...

  3. Jmeter调用Webapi介绍

    一.介绍     JMeter主要用于压力测试,使用Java编写,由Apache基金会管理     官方网站:http://jmeter.apache.org/index.html     下载地址: ...

  4. 关于 modelNameLike 查询无数据

    ---恢复内容开始--- 1.今天在测试的时候发现 model中的name不能模糊查询. ModelQuery modelQuery = repositoryService.createModelQu ...

  5. Echart学习

    制表,展示好帮手,自己看官方文档吧,有示例和入门指导 参考:1.http://echarts.baidu.com/tutorial.html#5%20%E5%88%86%E9%92%9F%E4%B8% ...

  6. OpenGL实现多层绘制(Layered Rendering) [转]

    http://blog.csdn.net/u010462297/article/details/50589991 引言 在某些情况下会需要用到多层绘制.FBO下有多个颜色挂接点(Color Attac ...

  7. uber shader

    shader 合在一起 用一些宏来控制 选哪部分编成一个想要的shader https://docs.unity3d.com/Manual/SL-MultipleProgramVariants.htm ...

  8. Webpack安装和配置

    一.安装和配置webpack 1.全局安装webpack 这样就安装好了webpack,可以再全局通过webpack -v来查看是否安装成功. 2.先创建项目目录结构,根目录是mywebpack.进入 ...

  9. 【angularJS】三个学习angulaJS的链接

    1.官方文档:https://code.angularjs.org/1.5.7/docs/api 2.A Better Way to Learn AngularJS:https://thinkster ...

  10. Windows下启动Solr报错:Nothing to start,exiting...

    如果用java -jar start.jar命令启动Solr时报错:Nothing to start,exiting...,可尝试: 百度jetty,上官网下载压缩包并解压(下载页面地址:http:/ ...