H.264(H264)解码SPS获取分辨率和帧率
#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获取分辨率和帧率相关推荐
- java h264 sps解码,H.264(H264)解码SPS获取分辨率和帧率
h264 ES流中的sps nalu中可以提取出视频宽度和高度的信息,有时可以得到固定帧率的信息,而对于变帧率的视频有时候得不到帧率信息,需要根据时间戳来呈现. 代码可以实现这个功能. #includ ...
- Android音视频开发基础(六):学习MediaCodec API,完成视频H.264的解码
前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了<Android 音视频从入门到提高 - 任务列表>.本文是Android音视 ...
- H264之sps解析分辨率
sps定义如下: 解析如下: 分辨率: 宽高可从SPS字段计算得到,公式如下: Width = (pic_width_in_mbs_minus1+1)*16; Height = (pic_height ...
- h.264并行解码算法分析
并行算法类型可以分为两类 Function-level Decomposition,按照功能模块进行并行 Data-level Decomposition,按照数据划分进行并行 Function-le ...
- 对于H.264编解码的探索
为什么需要视频编码 举个例子,如果摄像头输出分辨率为400*400的图像,那每一帧的大小就是400*400*8*3=3840000bit,折算下来一帧就需要468KB 一般情况下帧数都是30fps,那 ...
- H.264编解码标准的核心技术(提供相关流程图)
最近在学习H.264编解码知识,上网搜了不少资料看,发现大多数中文资料中都缺少相应的图片,例如编解码流程图.编码模板等,这对加深理解是很有帮助 的.木有办法,只好回去潜心阅读<H.264_MPE ...
- H.264视频编码推荐的分辨率和码率配置表
在各种视频编码标准中,行业一直在求追"高压缩比(数据量越小越好)",同时又保证"高视频质量"的算法.鱼和熊掌不可兼得,视频编码是一种折中的游戏.参数" ...
- H.264编解码浅析
声明:本文是阅读<新一代视频压缩标准H.264_AVC>笔记总结 简介 H.264,又称为MPEG-4第10部分,高级视频编码(英语:MPEG-4 Part 10, Advanced Vi ...
- H.264中的SPS和PPS
参考使用FFMPEG类库分离出多媒体文件中的H.264码流_雷霄骅的博客-CSDN博客 H.264码流第一个 NALU是 SPS(序列参数集Sequence Parameter Set) 对应H264 ...
最新文章
- 1.12 Java空对象(null)是怎么回事?
- 整型和浮点型的区别_浮点整型强转的一个题目解析
- python怎么连接MongoDB数据库
- 【译】RAID的概念和RAID对于SQL性能的影响
- KVM 虚拟化环境安装
- Linux网络服务-Web Service之【apache的功能、安装、配置文件介绍以及实验实例】(三)...
- #华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库
- 微众银行互联网架构首次曝光
- 《One-shot Voice Conversion by Separating Speaker and Content Representations with Instance Normaliz》
- 爆锤数据结构(期末复习笔记)
- 三星s8 android版本,三星S8系列国行获安卓8.0更新 用户泪奔
- 原生js实现表单的正则验证,所有验证都通过后提交按钮才可用
- 最美的时光在飞逝,为什么还在努力的路上蹒跚?
- Ubuntu下Logi MX Ergo自定义按键
- vmware虚拟机三种网卡
- js echarts 水球图
- 使用广播接收者获取短信及拦截电话
- 利用正则表达式爬取网络小说,并按照章节下载到本地
- 瓦隆大区,西欧数据中心优选
- softmax的log似然代价函数(公式求导)
热门文章
- php 3木目,拼多多质量调查:相机买回来才发现是木目木几
- Android 拨号键盘指令索引
- 3.2.2.频数分布
- linux恢复硬盘数据
- win7修复计算机消失,win7旗舰版系统重装后本地连接不见的恢复方法
- 【渝粤教育】21秋期末考试建设工程法规10221k2
- 编写程序,测试字符串“你好,欢迎来到Java世界”的长度,将字符串的长度转换成字符串进行输出,并对其中的“Java”四个字母进行截取,输出截取字母以及它在字符串中的位置。
- 创业者要处理好的10大关系
- it在计算机术语表示什么,File
- VC Spyglass CDC(二)常见的CDC处理方法