本人因为近期在读取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. 【读书笔记】Elasticsearch集成Hadoop最佳实践

    前言 本文记录[Elasticsearch集成Hadoop最佳实战]读书笔记 本书总计209页,共7章节,计划时间:20180712-20180717 (每天至少40页) 本文代码地址: https: ...

  2. delphi执行cmd命令和bat文件

    转载地址:http://blog.csdn.net/hutao1101175783/article/details/42807063 cmd:='echo d | Xcopy '+BasePath+' ...

  3. ActiveMQ安装与持久化消息

    activityMQ官网:http://activemq.apache.org/ 有windows版与linux版  windows版启动 在bin目录下双击activemq.bat linux版的安 ...

  4. TSynDBSQLDataSet

    TSynDBSQLDataSet 非内存表 TSynDBSQLDataSet = class(TSynBinaryDataSet) TSynBinaryDataSet = class(TSynVirt ...

  5. 【java】File的使用:将字符串写出到本地文件,大小0kb的原因

    实现方法: 暂时写一种方法,将字符串写出到本地文件,以后可以补充更多种方法: public static void main(String[] args) { /** * ============== ...

  6. 腾讯云会话服务器node+nginx

    1.除了一个正常的服务器还需要一个会话服务器(websocket),利用node加socket.io来做 2.正常安装Nginx yum install nginx 3.Nginx的配置内容略微不同( ...

  7. Java几种常见的四舍五入的方法

    /* * 在上面简单地介绍了银行家舍入法,目前java支持7中舍入法: 1. ROUND_UP:远离零方向舍入.向绝对值最大的方向舍入,只要舍弃位非0即进位. 2. ROUND_DOWN:趋向零方向舍 ...

  8. ArrayAdapter、SimpleAdapter和BaseAdapter示例代码

    import android.content.Context; import android.util.Pair; import android.view.View; import android.v ...

  9. centos7修改yum下载源为阿里源

    在国内很多yum源不好用,所以改成国内的源很有必要 首先,切换到yum源目录 cd /etc/yum.repos.d 备份一下 sudo mv CentOS-Base.repo CentOS-Base ...

  10. 【机器学习 & 数据挖掘 通俗介绍】

    如何向小白介绍何谓机器学习和数据挖掘?买回芒果他就懂了 JasonZheng • 2013-01-07 22:18   买芒果 嘴馋的你想吃芒果了,于是你走到水果摊,挑了几个让老板过过秤,然后你再根据 ...