获取.h264视频宽高的方法

花了2个通宵终于搞定。(后面附上完整代码)

http://write.blog.csdn.net/postedit/7852406

图像的高和宽在H264的SPS帧中。
在H264码流中,都是以"0x00 0x00 0x01"或者"0x00 0x00 0x00 0x01"为开始码的,找到开始码之后,使用开始码之后的第一个字节的低5位判断是否为7(sps),等于7表示该帧就是SPS帧,从该帧就可以解析出高和宽,SPS是个结构体,里面有两个成员:pic_width_in_mbs_minus1,pic_height_in_map_units_minus_1,分别表示图像的宽和高,以宏块(16x16)为单位的值减1,因此,实际的宽为 (pic_width_in_mbs_minus1+1)*16,高为 (pic_height_in_map_units_minus_1+1)*16

http://write.blog.csdn.net/postedit/7852406

 UINT Ue(BYTE *pBuff, UINT nLen, UINT &nStartBit)
 {
     //计算0bit的个数
     UINT nZeroNum = ;
     )
     {
         ] & ())) //&:按位与,%取余
         {
             break;
         }
         nZeroNum++;
         nStartBit++;
     }
     nStartBit ++;

     //计算结果
     DWORD dwRet = ;
     ; i<nZeroNum; i++)
     {
         dwRet <<= ;
         ] & ()))
         {
             dwRet += ;
         }
         nStartBit++;
     }
      << nZeroNum) -  + dwRet;
 }

 int Se(BYTE *pBuff, UINT nLen, UINT &nStartBit)
 {

 int UeVal=Ue(pBuff,nLen,nStartBit);
 double k=UeVal;
 );//ceil函数:ceil函数的作用是求不小于给定实数的最小整数。ceil(2)=ceil(1.2)=cei(1.5)=2.00
 ==)
 nValue=-nValue;
      return nValue;

 }

 DWORD u(UINT BitCount,BYTE * buf,UINT &nStartBit)
 {
     DWORD dwRet = ;
     ; i<BitCount; i++)
     {
         dwRet <<= ;
         ] & ()))
         {
             dwRet += ;
         }
         nStartBit++;
     }
 return dwRet;
 }

 bool h264_decode_seq_parameter_set(BYTE * buf,UINT nLen,int &Width,int &Height)
 {
 UINT StartBit=;
 ,buf,StartBit);
 ,buf,StartBit);
 ,buf,StartBit);
 )
 {
 ,buf,StartBit);
 ,buf,StartBit);//(buf[1] & 0x80)>>7;
 ,buf,StartBit);//(buf[1] & 0x40)>>6;
 ,buf,StartBit);//(buf[1] & 0x20)>>5;
 ,buf,StartBit);//(buf[1] & 0x10)>>4;
 ,buf,StartBit);
 ,buf,StartBit);

 int seq_parameter_set_id=Ue(buf,nLen,StartBit);

  || profile_idc ==  ||
 profile_idc ==  || profile_idc ==  )
 {
 int chroma_format_idc=Ue(buf,nLen,StartBit);
  )
 ,buf,StartBit);
 int bit_depth_luma_minus8=Ue(buf,nLen,StartBit);
 int bit_depth_chroma_minus8=Ue(buf,nLen,StartBit);
 ,buf,StartBit);
 ,buf,StartBit);

 ];
 if( seq_scaling_matrix_present_flag )
 {
 ; i < ; i++ ) {
 seq_scaling_list_present_flag[i]=u(,buf,StartBit);
 }
 }
 }
 int log2_max_frame_num_minus4=Ue(buf,nLen,StartBit);
 int pic_order_cnt_type=Ue(buf,nLen,StartBit);
  )
 int log2_max_pic_order_cnt_lsb_minus4=Ue(buf,nLen,StartBit);
  )
 {
 ,buf,StartBit);
 int offset_for_non_ref_pic=Se(buf,nLen,StartBit);
 int offset_for_top_to_bottom_field=Se(buf,nLen,StartBit);
 int num_ref_frames_in_pic_order_cnt_cycle=Ue(buf,nLen,StartBit);

 int *offset_for_ref_frame=new int[num_ref_frames_in_pic_order_cnt_cycle];
 ; i < num_ref_frames_in_pic_order_cnt_cycle; i++ )
 offset_for_ref_frame[i]=Se(buf,nLen,StartBit);
 delete [] offset_for_ref_frame;
 }
 int num_ref_frames=Ue(buf,nLen,StartBit);
 ,buf,StartBit);
 int pic_width_in_mbs_minus1=Ue(buf,nLen,StartBit);
 int pic_height_in_map_units_minus1=Ue(buf,nLen,StartBit);

 Width=(pic_width_in_mbs_minus1+)*;
 Height=(pic_height_in_map_units_minus1+)*;

 return true;
 }
 else
 return false;
 }

 void CCommDlg::OnOK()
 {
 CString  str;
 //数据必须把H264的头0x000001去掉
 BYTE bytes[]={0x67,0x64,0x08,0x1F,0xAC,0x34,0xC1,0x08,0x28,0x0F,0x64};
 UINT startbit=;
 int Width,Height;
 ,Width,Height))
 {
 str.Format("%d-%d",Width,Height);

 AfxMessageBox(str);
 }
 }

从H264码流中获取视频宽高 (SPS帧)的更多相关文章

  1. 从H264码流中获取视频宽高 (SPS帧) 升级篇

    之前写过 <从H264码流中获取视频宽高 (SPS帧)> . 但发现很多局限性,而且有时解出来是错误的. 所以重新去研究了. 用了 官方提供的代码库来解析. 花了点时间,从代码库里单独把解 ...

  2. H264码流中SPS PPS详解&lt;转&gt;

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

  3. Activity启动过程中获取组件宽高的五种方式

    第一种:(重写Activity的onWindowFocusChanged方法) /** * 重写Acitivty的onWindowFocusChanged方法 */ @Override public ...

  4. H.264从SPS中提取视频宽高

    H.264有两种封装模式: (1)annexb模式:传统模式,使用start code来分隔NAL, SPS和PPS是在ES流的头部: (2)mp4模式:没有start code,使用NALU长度(固 ...

  5. android onCreate中获取view宽高为0的解决方法

    view.post(runnable) 通过post可以将一个runnable投递到消息队列的尾部,然后等待UI线程Looper调用此runnable的时候,view也已经初始化好了. view.po ...

  6. Activity正确获取View宽高

    在View的measure完成后,一般可以通过getMeasureWidth/getMeasureWidth方法可以正确的获取View的宽高,而在特殊情况下,可能需要多次measure才能确定最终的测 ...

  7. H264码流打包分析

    转自:http://www.360doc.com/content/13/0124/08/9008018_262076786.shtml   SODB 数据比特串-->最原始的编码数据 RBSP ...

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

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

  9. H264码流解析及NALU

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

随机推荐

  1. iOS 自定义UITableViewCell

    #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...

  2. Windows下安装GnuRadio最简单的方法(没有之一)

    作者在Windows XP SP3 32位下亲测通过,理论上Win7也没问题. 1. 如果系统中安装有Python,请先把Python卸载. 2. 下载安装Python(x,y) 2.7.5.0, 下 ...

  3. Fastjson简单使用方法

    一.简单数据的序列化 pubic class UserInfo implements Serializable{ private String name; private int age; publi ...

  4. 洛谷 P3927 Factorial

    题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. SOL菌表示不服,立刻就要算这个数在k进制表示下末尾0的个数. 但是SOL菌太菜了于是请 ...

  5. Eclipse Maven构建WebApp项目资源目录显示不全的原因与解决方式

    一.问题展示 1.Eclipse在使用Maven构建WebApp项目的时候,首先Maven的安装和配置都没有问题的,但是构建项目之后,Maven项目要求的几个必须要有的资源目录显示不了: 问题如下图: ...

  6. [Error]Python虚拟环境报错 OSError: setuptools pip wheel failed with error code 2

    mkvirtualenv py35 python新建虚拟环境报错,setuptools pip wheel failed with error code 2 刚好昨天在CentOS安装的时候也总是报s ...

  7. java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration] with root cause

    在用Java web和hbase连接时,报出来这个错误,一开始我以为是hbase导入的包位置不对,不从build path那里导入,而是从WEB-INF下的lib中导入,尝试了之后结果仍是这个错误 十 ...

  8. 01List.ashx(班级列表动态页面)

    01List.html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <he ...

  9. 使用LeakCanary检测内存泄露 翻译 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  10. HIBERNATE知识复习记录1-连接及常用方法

    要去面试了,复习一下HIBERNATE的相关知识吧,原来边看视频边写的代码如下,已经分不清先后次序了,大致看一看吧. 先看下总的配置文件hibernate.cfg.xml: <?xml vers ...