h264编码之SPS解析
一、概念
SPS即Sequence Paramater Set,又称作序列参数集。SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。
二、定义
H.264标准协议中规定的SPS格式位于文档的7.3.2.1.1,如下图所示:


1、profile_idc
根据《T-REC-H.264-201402-I!!PDF-E》的附件A.2定义,profiles有如下类型:

profile_idc的值用来确定码流符合哪一种档次。根据Annex A协议定义,整理表格如下:
| profiles | profile_idc | 
| baseline profile | 66 | 
| main profile | 77 | 
| extended profile | 88 | 
| High profile | 100 | 
| High 10 profile | 110 | 
| High 4:2:2 profile | 122 | 
| High 10 Intra profile | profile_idc=110 && constraint_set3_flag=1 | 
| High 4:2:2 Intra profile | profile_idc = 122 && constraint_set3_flag = 1 | 
| High 4:4:4 Intra profile | profile_idc = 244 && constraint_set3_flag =1 | 
| CAVLC 4:4:4 Intra profile | 44 | 
2、constraint_set0_flag - constraint_set3_flag
辅助profile_idc确定编码的profiles。
constraint_set0_flag 等于1是指比特流遵从A.2.1节中的所有规定。constraint_set0_flag 等于0是指该比特流可以遵从也可以不遵从A.2.1节中的所有规定。

3、level_idc
标识当前码流的Level。编码的Level定义了某种条件下的最大视频分辨率、最大视频帧率等参数,码流所遵从的level由level_idc指定。

例如码流中,level_idc = 0x29 = 41,因此码流的级别为4.1。
 
 
4、seq_parameter_set_id
用于识别图像参数集所指的序列参数集。seq_parameter_set_id值在0-31的范围内,包括0和31。
使用无符号整数指数哥伦布码编码的语法元素(具体方法需参见9.1指数哥伦布编码的解析过程)与Slice head的pic_parameter_set_id对应。

我们使用ffmpeg进行解析的时候,经常碰到non-existing SPS/PPS,如下打印:
 
实际上就是GOP的SPS和PPS丢失,再解析视频帧,报的无法解析错误。ffmpeg代码分析如下:
ff_h264_decode_seq_parameter_set、ff_h264_decode_picture_parameter_set会读取sps_id、pps_id。申请对应缓存

然后h264_slice_header_parse解析视频帧时,会判断该缓存是否正常申请:

没有正常申请,说明SPS、PPS丢失,无法正常解码,丢失该帧。
5、log2_max_frame_num_minus4 取值范围0-12,包括0和12
按照如下公式可得出与frame_num相关的变量MaxFrameNum的值:
 
 
6、pic_order_cnt_type
是指解码图像顺序picture order count(POC)的计数方法(如 8.2.1 节所述)。POC是另一种计量图像序号的方式,与frame_num有着不同的计算方法。该语法元素的取值为0、1或2。
7、log2_max_pic_order_cnt_lsb_minus4
表示用于8.2.1节规定的图像顺序数解码过程中的变量MaxPicOrderCntLsb的值,公式如下:

8、num_ref_frames
num_ref_frames规定了可能在视频序列中任何图像帧间预测的解码过程中用到的短期参考帧和长期参考帧、互补参考场对以及不成对的参考场的最大数量。num_ref_frames 字段也决定了 8.2.5.3 节规定的滑动窗口操作的大小。num_ref_frames 的取值范围应该在 0 到 MaxDpbSize (参见 A.3.1 或 A.3.2 节的定义)范围内,包括 0 和MaxDpbSize。
9、gaps_in_frame_num_value_allowed_flag
gaps_in_frame_num_value_allowed_flag 表示 7.4.3 节给出的 frame_num 的允许值以及在 8.2.5.2 节给出的frame_num 值之间存在推测的差异的情况下进行的解码过程。
10、pic_width_in_mbs_minus1

11、pic_height_in_map_units_minus1

12、frame_mbs_only_flag
frame_mbs_only_flag=0:表示编码视频序列的编码图像可能是编码场或编码帧。frame_mbs_only_flag=1:表示编码视频序列的每个编码图像都是一个仅包含帧宏块的编码帧。
13、direct_8x8_inference_flag
direct_8x8_inference_flag表示在8.4.1.2节中规定的B_Skip、B_Direct_16x16和B_Direct_8x8亮度运动矢量的计算过程使用的方法。当frame_mbs_only_flag等于0时direct_8x8_inference_flag应等于1。
14、frame_cropping_flag
frame_cropping_flag=1:表示帧剪切偏移参数遵从视频序列参数集中的下一个值。frame_cropping_flag=0:表示不存在帧剪切偏移参数。
15、vui_parameters_present_flag
vui_parameters_present_flag=1:表示存在如附录E提到的vui_parameters()语法结构。
 vui_parameters_present_flag=0:表示不存在如附录E提到的vui_parameters()语法结构。
相关文章:
 
h264编码之SPS解析
一、概念 SPS即Sequence Paramater Set,又称作序列参数集。SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。 二、定义 H.264标准协议中规定的SPS格式位于文档的7.3.2.1.1,如下图所示: 1、profile_idc 根据《T-REC-H.264-2…...
 
使用R语言包clusterProfiler做KEGG富集分析时出现的错误及解决方法
使用enrichKEGG做通路富集分析时,一直报错:显示No gene can be mapped....k <- enrichKEGG(gene gene, organism "hsa", pvalueCutoff 1, qvalueCutoff 1)但是之前用同样的基因做分析是能够成功地富集到通路,即便是网上的数据…...
 
框架——MyBatis的入门案例
框架概述1.1什么是框架框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交与的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义…...
 
hadoop兼容性验证
前言 Hadoop是一个由Apache基金会所开发的分布式系统基础架构,主要解决海量数据的存储和海量数据的分析计算问题,广义上来说,Hadoop通常是指一个更广泛的概念–hadoop生态圈 Hadoop优缺点: 优点: 1、高可靠性&#x…...
 
运维提质增效,有哪些办法可以做
凡是代码,难免有 bug。 开发者们的日常,除了用一行行代码搭产品外,便是找出代码里的虫,俗称 debug。 随着移动互联网的快速发展,App 已经成为日常生活中不可或缺的一部分。但是在开发者/运维人员的眼里简直就是痛苦的…...
c++基础——结构体
结构体结构体(struct),可以看做是一系列称为成员元素的组合体。可以看做是自定义的数据类型。定义结构体struct abc {int x;int y; } e[array_length];const abc a; abc b, B[array_length], tmp; abc *c;上例中定义了一个名为 abc 的结构体&…...
 
applicationContext相关加载
spring refresh 概述 refresh是一个方法,spring中所有的ApplicationContext容器都需要通过refresh方法初始化; 处理步骤 其中refresh方法包含12个主要的处理步骤: 1、第1个步骤做前置准备 2、第2~6步骤创建BeanFactory(Appl…...
 
数据同步工具Sqoop
大数据Hadoop之——数据同步工具SqoopSqoop基本原理及常用方法 1 概述 Apache Sqoop(SQL-to-Hadoop)项目旨在协助RDBMS(Relational Database Management System:关系型数据库管理系统)与Hadoop之间进行高效的大数据交…...
Kafka 版本
kafka-2.11-2.1.1 : Kafka 1.0.0 后,Kafka 版本命名规则从 4 位到 3 位Kafka版本号是 2.1.1前 2 : 大版本号 (MajorVersion)中 1 : 小版本号或次版本号 (Minor Version)后 1 : 修订版本号 (Patch) Kafka 0.7 最早开源版本 : 只提供最基础的消息队列功…...
 
ElasticSearch 在Java中的各种实现
ES JavaAPI的相关体系: 词条查询 所谓词条查询,也就是ES不会对查询条件进行分词处理,只有当词条和查询字符串完全匹配时,才会被查询到。 等值查询-term 等值查询,即筛选出一个字段等于特定值的所有记录。 【SQL】 s…...
 
SpringBoot整合Knife4j
文章目录前言一、Knife4j是什么?二、使用步骤1.导入依赖2.编写配置文件3.编写controller和实体类4.测试总结前言 接上篇整合Swagger链接奉上http://t.csdn.cn/9mXSu 一、Knife4j是什么? 官方文档:https://doc.xiaominfo.com/ knife4j可以理解…...
 
MyISAM和InnoDB存储引擎的区别
目录前言存储引擎区别事务外键表单的存储数据查询效率数据更新效率如何选择前言 MyISAM和InnoDB是使用MySQL最常用的两种存储引擎,在5.5版本之前默认采用MyISAM存储引擎,从5.5开始采用InnoDB存储引擎。 存储引擎 存储引擎是:数据库管理系统…...
SpringMVC自定义处理多种日期格式的格式转换器
package cn.itcast.utils;import org.springframework.core.convert.converter.Converter;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;/*** 把字符串转换日期*/public class StringToDateConverter implements Converter<String…...
 
NYUv2生成边界GT(1)
看了cityscape和NYUv2生成边界GT的代码后,因为自己使用的是NYUv2数据集,所以需要对自己的数据集进行处理。CASENet生成边界GT所使用的代码是MATLAB,所以又重新看了一下MATLAB的代码,并进行修改,生成了自己的边界代码。…...
 
Spring基本概念与使用
文章目录一、Spring概念1.容器2.IoC3.DI4.Ioc与DI的关系二、Spring创建与使用1.Maven2.添加Spring框架支持注:国内的Maven源配置3.简单实例(1)创建一个Bean对象。(2)将Bean对象存储到Spring当中(3ÿ…...
 
安恒信息java实习面经
目录1.Java ME、EE、SE的区别,Java EE相对于SE多了哪些东西?2.jdk与jre的区别3.说一下java的一些命令,怎么运行一个jar包4.简单说一下java数据类型及使用场景5.Map跟Collection有几种实现?6.面向对象的特性7.重载和重写的区别8.重…...
 
第八章:枚举类与注解
第八章:枚举类与注解 8.1:枚举类的使用  类的对象只有有限个,确定的。我们称此类为枚举类。当需要定义一组常量是,强烈建议使用枚举类。如果枚举类中只有一个对象,则可以作为单例模式的实现方式。 如何定义枚举类 …...
 
Ceph介绍
分布式存储概述 常用的存储可以分为DAS、NAS和SAN三类 DAS:直接连接存储,是指通过SCSI接口或FC接口直接连接到一台计算机上,常见的就是服务器的硬盘NAS:网络附加存储,是指将存储设备通过标准的网络拓扑结构ÿ…...
remove 和 erase 的区别
remove 和 erase 的区别 以容器vector来说明remove和erase的区别 在STL中,vector容器也提供了remove()和erase()函数,用于从vector中删除元素。虽然这两个函数都可以实现删除元素的功能,但是它们之间还是有一些区别的。 remove() remove(…...
 
NFTScan:怎么使用 NFT API 开发一个 NFT 数据分析平台?
对很多开发者来说,在 NFT 数据海洋中需要对每个 NFT 进行索引和筛选是十分困难且繁琐的,NFT 数据获取仍是一大问题。而数据平台提供的 API 使得开发者可以通过接口获取区块链上 NFT 的详细信息,并对其进行分析、处理、统计和可视化。在本篇文…...
 
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
 
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
 
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
 
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
 
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
