#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <math.h>typedef  unsigned int UINT;
typedef  unsigned char BYTE;
typedef  unsigned long DWORD;UINT Ue(BYTE *pBuff, UINT nLen, UINT &nStartBit)
{//计算0bit的个数UINT nZeroNum = 0;while (nStartBit < nLen * 8){if (pBuff[nStartBit / 8] & (0x80 >> (nStartBit % 8))) //&:按位与,%取余{break;}nZeroNum++;nStartBit++;}nStartBit ++;//计算结果DWORD dwRet = 0;for (UINT i=0; i<nZeroNum; i++){dwRet <<= 1;if (pBuff[nStartBit / 8] & (0x80 >> (nStartBit % 8))){dwRet += 1;}nStartBit++;}return (1 << nZeroNum) - 1 + dwRet;
}int Se(BYTE *pBuff, UINT nLen, UINT &nStartBit)
{int UeVal=Ue(pBuff,nLen,nStartBit);double k=UeVal;int nValue=ceil(k/2);//ceil函数:ceil函数的作用是求不小于给定实数的最小整数。ceil(2)=ceil(1.2)=cei(1.5)=2.00if (UeVal % 2==0)nValue=-nValue;return nValue;
}DWORD u(UINT BitCount,BYTE * buf,UINT &nStartBit)
{DWORD dwRet = 0;for (UINT i=0; i<BitCount; i++){dwRet <<= 1;if (buf[nStartBit / 8] & (0x80 >> (nStartBit % 8))){dwRet += 1;}nStartBit++;}return dwRet;
}/*** H264的NAL起始码防竞争机制** @param buf SPS数据内容** @无返回值*/
void de_emulation_prevention(BYTE* buf,unsigned int* buf_size)
{int i=0,j=0;BYTE* tmp_ptr=NULL;unsigned int tmp_buf_size=0;int val=0;tmp_ptr=buf;tmp_buf_size=*buf_size;for(i=0;i<(tmp_buf_size-2);i++){//check for 0x000003val=(tmp_ptr[i]^0x00) +(tmp_ptr[i+1]^0x00)+(tmp_ptr[i+2]^0x03);if(val==0){//kick out 0x03for(j=i+2;j<tmp_buf_size-1;j++)tmp_ptr[j]=tmp_ptr[j+1];//and so we should devrease bufsize(*buf_size)--;}}
}/*** 解码SPS,获取视频图像宽、高和帧率信息** @param buf SPS数据内容* @param nLen SPS数据的长度* @param width 图像宽度* @param height 图像高度* @成功则返回true , 失败则返回false*/
bool h264_decode_sps(BYTE * buf,unsigned int nLen,int &width,int &height,int &fps)
{UINT StartBit=0;fps=0;de_emulation_prevention(buf,&nLen);int forbidden_zero_bit=u(1,buf,StartBit);int nal_ref_idc=u(2,buf,StartBit);int nal_unit_type=u(5,buf,StartBit);if(nal_unit_type==7){int profile_idc=u(8,buf,StartBit);int constraint_set0_flag=u(1,buf,StartBit);//(buf[1] & 0x80)>>7;int constraint_set1_flag=u(1,buf,StartBit);//(buf[1] & 0x40)>>6;int constraint_set2_flag=u(1,buf,StartBit);//(buf[1] & 0x20)>>5;int constraint_set3_flag=u(1,buf,StartBit);//(buf[1] & 0x10)>>4;int reserved_zero_4bits=u(4,buf,StartBit);int level_idc=u(8,buf,StartBit);int seq_parameter_set_id=Ue(buf,nLen,StartBit);if( profile_idc == 100 || profile_idc == 110 ||profile_idc == 122 || profile_idc == 144 ){int chroma_format_idc=Ue(buf,nLen,StartBit);if( chroma_format_idc == 3 )int residual_colour_transform_flag=u(1,buf,StartBit);int bit_depth_luma_minus8=Ue(buf,nLen,StartBit);int bit_depth_chroma_minus8=Ue(buf,nLen,StartBit);int qpprime_y_zero_transform_bypass_flag=u(1,buf,StartBit);int seq_scaling_matrix_present_flag=u(1,buf,StartBit);int seq_scaling_list_present_flag[8];if( seq_scaling_matrix_present_flag ){for( int i = 0; i < 8; i++ ) {seq_scaling_list_present_flag[i]=u(1,buf,StartBit);}}}int log2_max_frame_num_minus4=Ue(buf,nLen,StartBit);int pic_order_cnt_type=Ue(buf,nLen,StartBit);if( pic_order_cnt_type == 0 )int log2_max_pic_order_cnt_lsb_minus4=Ue(buf,nLen,StartBit);else if( pic_order_cnt_type == 1 ){int delta_pic_order_always_zero_flag=u(1,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];for( int i = 0; 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);int gaps_in_frame_num_value_allowed_flag=u(1,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+1)*16;height=(pic_height_in_map_units_minus1+1)*16;int frame_mbs_only_flag=u(1,buf,StartBit);if(!frame_mbs_only_flag)int mb_adaptive_frame_field_flag=u(1,buf,StartBit);int direct_8x8_inference_flag=u(1,buf,StartBit);int frame_cropping_flag=u(1,buf,StartBit);if(frame_cropping_flag){int frame_crop_left_offset=Ue(buf,nLen,StartBit);int frame_crop_right_offset=Ue(buf,nLen,StartBit);int frame_crop_top_offset=Ue(buf,nLen,StartBit);int frame_crop_bottom_offset=Ue(buf,nLen,StartBit);}int vui_parameter_present_flag=u(1,buf,StartBit);if(vui_parameter_present_flag){int aspect_ratio_info_present_flag=u(1,buf,StartBit);if(aspect_ratio_info_present_flag){int aspect_ratio_idc=u(8,buf,StartBit);if(aspect_ratio_idc==255){int sar_width=u(16,buf,StartBit);int sar_height=u(16,buf,StartBit);}}int overscan_info_present_flag=u(1,buf,StartBit);if(overscan_info_present_flag)int overscan_appropriate_flagu=u(1,buf,StartBit);int video_signal_type_present_flag=u(1,buf,StartBit);if(video_signal_type_present_flag){int video_format=u(3,buf,StartBit);int video_full_range_flag=u(1,buf,StartBit);int colour_description_present_flag=u(1,buf,StartBit);if(colour_description_present_flag){int colour_primaries=u(8,buf,StartBit);int transfer_characteristics=u(8,buf,StartBit);int matrix_coefficients=u(8,buf,StartBit);}}int chroma_loc_info_present_flag=u(1,buf,StartBit);if(chroma_loc_info_present_flag){int chroma_sample_loc_type_top_field=Ue(buf,nLen,StartBit);int chroma_sample_loc_type_bottom_field=Ue(buf,nLen,StartBit);}int timing_info_present_flag=u(1,buf,StartBit);if(timing_info_present_flag){int num_units_in_tick=u(32,buf,StartBit);int time_scale=u(32,buf,StartBit);fps=time_scale/num_units_in_tick;int fixed_frame_rate_flag=u(1,buf,StartBit);if(fixed_frame_rate_flag){fps=fps/2;}}}return true;}elsereturn false;
}

timing_info_present_flag等于1表示num_units_in_tick,time_scale和fixed_frame_rate_flag在比特流中存在。

timing_info_present_flag等于0表示num_units_in_tick,time_scale和fixed_frame_rate_flag在比特流中不存在。

因此,当timing_info_present_flag等于0时,无法得到码率,bool h264_decode_sps(BYTE * buf,unsigned int nLen,int &width,int &height,int &fps)参数fps返回值为0,可据此设置一个默认帧率。

参考链接:http://blog.csdn.net/qq_27727131/article/details/51799663

原创不易,转载请标明出处:https://blog.csdn.net/caoshangpa/article/details/53083410

H.264(H264)解码SPS获取分辨率和帧率相关推荐

  1. java h264 sps解码,H.264(H264)解码SPS获取分辨率和帧率

    h264 ES流中的sps nalu中可以提取出视频宽度和高度的信息,有时可以得到固定帧率的信息,而对于变帧率的视频有时候得不到帧率信息,需要根据时间戳来呈现. 代码可以实现这个功能. #includ ...

  2. Android音视频开发基础(六):学习MediaCodec API,完成视频H.264的解码

    前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了<Android 音视频从入门到提高 - 任务列表>.本文是Android音视 ...

  3. H264之sps解析分辨率

    sps定义如下: 解析如下: 分辨率: 宽高可从SPS字段计算得到,公式如下: Width = (pic_width_in_mbs_minus1+1)*16; Height = (pic_height ...

  4. h.264并行解码算法分析

    并行算法类型可以分为两类 Function-level Decomposition,按照功能模块进行并行 Data-level Decomposition,按照数据划分进行并行 Function-le ...

  5. 对于H.264编解码的探索

    为什么需要视频编码 举个例子,如果摄像头输出分辨率为400*400的图像,那每一帧的大小就是400*400*8*3=3840000bit,折算下来一帧就需要468KB 一般情况下帧数都是30fps,那 ...

  6. H.264编解码标准的核心技术(提供相关流程图)

    最近在学习H.264编解码知识,上网搜了不少资料看,发现大多数中文资料中都缺少相应的图片,例如编解码流程图.编码模板等,这对加深理解是很有帮助 的.木有办法,只好回去潜心阅读<H.264_MPE ...

  7. H.264视频编码推荐的分辨率和码率配置表

    在各种视频编码标准中,行业一直在求追"高压缩比(数据量越小越好)",同时又保证"高视频质量"的算法.鱼和熊掌不可兼得,视频编码是一种折中的游戏.参数" ...

  8. H.264编解码浅析

    声明:本文是阅读<新一代视频压缩标准H.264_AVC>笔记总结 简介 H.264,又称为MPEG-4第10部分,高级视频编码(英语:MPEG-4 Part 10, Advanced Vi ...

  9. H.264中的SPS和PPS

    参考使用FFMPEG类库分离出多媒体文件中的H.264码流_雷霄骅的博客-CSDN博客 H.264码流第一个 NALU是 SPS(序列参数集Sequence Parameter Set) 对应H264 ...

最新文章

  1. 1.12 Java空对象(null)是怎么回事?
  2. 整型和浮点型的区别_浮点整型强转的一个题目解析
  3. python怎么连接MongoDB数据库
  4. 【译】RAID的概念和RAID对于SQL性能的影响
  5. KVM 虚拟化环境安装
  6. Linux网络服务-Web Service之【apache的功能、安装、配置文件介绍以及实验实例】(三)...
  7. #华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库
  8. 微众银行互联网架构首次曝光
  9. 《One-shot Voice Conversion by Separating Speaker and Content Representations with Instance Normaliz》
  10. 爆锤数据结构(期末复习笔记)
  11. 三星s8 android版本,三星S8系列国行获安卓8.0更新 用户泪奔
  12. 原生js实现表单的正则验证,所有验证都通过后提交按钮才可用
  13. 最美的时光在飞逝,为什么还在努力的路上蹒跚?
  14. Ubuntu下Logi MX Ergo自定义按键
  15. vmware虚拟机三种网卡
  16. js echarts 水球图
  17. 使用广播接收者获取短信及拦截电话
  18. 利用正则表达式爬取网络小说,并按照章节下载到本地
  19. 瓦隆大区,西欧数据中心优选
  20. softmax的log似然代价函数(公式求导)

热门文章

  1. php 3木目,拼多多质量调查:相机买回来才发现是木目木几
  2. Android 拨号键盘指令索引
  3. 3.2.2.频数分布
  4. linux恢复硬盘数据
  5. win7修复计算机消失,win7旗舰版系统重装后本地连接不见的恢复方法
  6. 【渝粤教育】21秋期末考试建设工程法规10221k2
  7. 编写程序,测试字符串“你好,欢迎来到Java世界”的长度,将字符串的长度转换成字符串进行输出,并对其中的“Java”四个字母进行截取,输出截取字母以及它在字符串中的位置。
  8. 创业者要处理好的10大关系
  9. it在计算机术语表示什么,File
  10. VC Spyglass CDC(二)常见的CDC处理方法