本人由于最近在读取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. h264码流文件通过计算first_mb_in_slice区分帧边界

    摘抄网址:http://blog.csdn.net/huanggang982/article/details/37929905 本人由于最近在读取h264文件的时候,遇到如何读取完整一帧数据的问题,通 ...

  2. H.264裸流文件中获取每一帧数据

    测试解码器性能时,最常用的无非是向解码器中推送码流. 之前封装了一个avc的解码器,想做一个测试,读取H.264裸流文件将码流定期定时推送到解码器. 测试其实很简单: 1.了解H.264裸流文件的构成 ...

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

    原文:http://www.mworkbox.com/wp/work/314.html MP4的视频H264封装有2种格式:h264和avc1,对于这个细节,很容易被忽略.笔者也是在改编LIVE555 ...

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

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

  5. 编码为H264裸流并写文件一

    为什么说是裸流呢,因为这篇只讲到把视频编码后写入文件,得到的是一个后缀应该为".h264"的文件,只能用PotPlayer等功能强大的播放器才能打开,因为它没有容器信息,需要装在M ...

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

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

  7. ps流 转发_(转)RTP协议全解(H264码流和PS流)

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

  8. RTP协议解析和H264码流提取

    一. h264基础概念 SODB: 数据比特串-->最原始的编码数据 RBSP: 原始字节序列载荷-->在SODB的后面填加了结尾比特(RBSP trailing bits 一个bit&q ...

  9. Android MediaCodec 解码H264码流播放

    视频编解码,编的是什么码?解的又是什么码?有没有想过?现在主流的就是H264码流,Android 采集摄像头原始帧数据 这篇博客讲解的是如何从摄像头从提取YUV画面色值,然后由MediaCodec进行 ...

  10. H264码流插入自定义数据(SEI字段)

    文章目录 前言 一.H264码流结构 1. 文字说明 2. 码流格式图解 二.自定义数据封装以及H264码流插入 1.将自定义数据封装成SEI字段通用格式即可插入H264码流中 2.编程逻辑 三.附上 ...

最新文章

  1. flannel 概述 - 每天5分钟玩转 Docker 容器技术(58)
  2. 如何得到iterator的当前元素_链表进化!双向链表+迭代器(Iterator)!
  3. 判别两棵树是否相等 设计算法_从匈牙利算法到KM算法
  4. surging 微服务引擎 2.0 会有多少惊喜?
  5. mongdb集群3.4 shard 模式
  6. 案例解析|广东自由流收费稽核方案,AI稽核新模式
  7. 腾讯视频如何设置缓存画质和个数
  8. 一夜回到解放前,无数可依情况下如何做好风险控制
  9. [Python]爬拉钩(Python职位)
  10. oracle 新手注意事项
  11. java多线程同步synchronized,浅析Java多线程同步synchronized,javasynchronized
  12. HDU---3642:Get The Treasury【立方体体积并】
  13. DB2 SQLCODE 异常大全编辑(一)
  14. 每天读点故事产品体验报告
  15. office2007安装失败2902_Office2007安装出错怎么办?安装出错原因及解决方法分享
  16. C语言RLE压缩解压算法(西电C程序作业4)
  17. 二硫化锡/纳米碳/MXene/PANI复合材料研究进展
  18. 4.请编写一个函数void fun(char *tt,int pp[]),统计在tt字符串中“a”到“z”26个字母各自出现的次数,并依次放在pp所指数组中。
  19. 06-----the inferior stopped because it triggered an exception
  20. android下怎样伪装mac,Android刷成iOS?史上最强苹果伪装教程

热门文章

  1. 如何使用SVG生成超酷的页面预加载素描动画效果
  2. 如何让Div层悬浮在Flash Object对象之上(转载)
  3. 关于Neo4j 强连通分量算法,你了解多少?
  4. IDC:“互联网+流通”将进一步释放活力
  5. UVALive - 7147 (数学)
  6. 音视频开发音频处理技术
  7. 【lpxt】笔者支招:九招搞定显示器黑屏
  8. “Error:(1, 1) java: 非法字符: '\ufeff'”错误解决办法
  9. 《深入剖析Tomcat》一3.3 小结
  10. 苹果支付2500万美元和解专利侵权诉讼 获技术授权