获取.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. android onCreate中获取view宽高为0的解决方法

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

  3. H264码流打包分析

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

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

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

  5. H264码流解析及NALU

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

  6. android 中获取视频文件的缩略图(非原创)

    在android中获取视频文件的缩略图有三种方法: 1.从媒体库中查询 2. android 2.2以后使用ThumbnailUtils类获取 3.调用jni文件,实现MediaMetadataRet ...

  7. android中加载的html获取的宽高不正确

    wap页面使用 js库是zepto,按照惯例在$(function(){})中,来获取当前可视区的宽高,但得到的宽高却与预想的相差十万八千里. 原本android手机的浏览器设定的宽高基本是360*6 ...

  8. ios从相册:摄像头中获取视频

    ios从相册/摄像头中获取视频 如何从相册中获取视频 使用的是一个和获取照片相同的类UIImagePickerController //相册中获取视频 - (IBAction)clickViedoOF ...

  9. hisi出的H264码流结构

    hisi出的H264码流结构: IDR帧结构如下: 开始码 + nalu + I帧    +    开始码 + nalu + SPS    +     开始码 + nalu + PPS    +    ...

随机推荐

  1. JS控制键盘录入 和 window.event.keycode对照

    一.只允许录入整数 1.不允许录入非数字(按下字母键就会提示并清空) function intOnly() { if (!(window.event.keyCode >= 48 &&am ...

  2. Ant_build.xml的最完整解释

    Ant的概念Make命令是一个项目管理工具,而Ant所实现功能与此类似.像make,gnumake和nmake这些编译工具都有一定的缺陷,但是Ant却克服了这些工具的缺陷.最初Ant开发者在开发跨平台 ...

  3. PHP变量入门教程(1)基础

    基础 PHP 中一个美元符号后面跟上一个变量名称,即表示一个变量.变量的名称是对大小写敏感的. 变量名与 PHP 中其它的标签一样遵循相同的规则.一个有效的变量名由字母或者下划线开头,后面跟上任意数量 ...

  4. SYSTick 定时器

        CM3 内核的处理器,内部包含了一个 SysTick 定时器,(SysTick 的时钟源自 HCLK 的 8 分频,8个系统时钟周期systick跳一个,即8*1/72M=1/9 us)Sys ...

  5. 根据UUID和MD5, 生成可以用作Token的字符串

    import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util. ...

  6. du 使用详解 linux查看目录大小 linux统计目录大小并排序 查看目录下所有一级子目录文件夹大小 du -h --max-depth=1 |grep [

    常用命令 du -h --max-depth=1 |grep [TG] |sort   #查找上G和T的目录并排序 du -sh    #统计当前目录的大小,以直观方式展现 du -h --max-d ...

  7. mysql 5.6 read-committed隔离级别下并发插入唯一索引导致死锁一例

    今天,某个环境又发生了死锁,如下: *** (1) TRANSACTION:TRANSACTION 735307073, ACTIVE 0 sec insertingmysql tables in u ...

  8. post 的body json要使用双引号,而不是单引号

      string parse error , JS eval error {'name' : 'wade' }   http://json.parser.online.fr/ string parse ...

  9. OS X 在Cisco无线环境下丢包分析 part 1

    补发一篇博客,之前遇到的没有写成博文的一个情况.我擦,那一阵儿真是被无线搞疯了. 现象:苹果OS X用户连入WiFi之后莫名丢包,而且有规律的丢,丢个5s恢复正常,再过会儿再丢5s左右. 就如同这样 ...

  10. 解决Sharepoint每天第一次打开速度慢的问题

    每天第一次打开Sharepoint的网站会非常慢,下面是解决这个问题的几个方法. 添加crl.microsoft.com到Hosts文件,IP地址指向服务器本机. 允许服务器直接连接到crl.micr ...