当前位置: 首页 > news >正文

音视频入门基础:H.264专题(9)——SPS简介

一、SPS简介

nal_unit_type为7的NALU是SPS(Sequence parameter set,序列参数集):

H.264官方文档《T-REC-H.264-202108-I!!PDF-E.pdf》第44页到45页对SPS的数据语法进行了说明:

SPS和PPS中存放了解码过程中所需要的各种参数。一般情况下SPS和PPS位于整个码流的起始位置,解码器在解码一路码流的时候,首先要读入SPS和PPS,没有它们,视频将会无法解码。通过解析SPS中的特定参数,可以获取到视频的帧率、分辨率、这路码流的编码档次、像素格式(是YUV 4:2:0、YUV 4:2:2还是YUV 4:4:4)等关键信息。播放器(比如vlc)播放媒体文件,就是从SPS拿到大部分的媒体信息的:

用H.264编码的实时流,比如传输流,通常用Annex B包装。由于实时流中解码器需要在码流中间开始解码,并且编码器在编码的过程中可能会改变码流的参数(如图像分辨率等),所以这些格式中通常会周期性的重复SPS和PPS包(在IDR SLICE之前)。从而让解码器可以加入一个正在进行的流,及播放一个已经在传输的流。

关于SPS中的属性可以参考:《如何在H264码流的SPS中获取宽和高信息?》、《解析H.264码流中的SPS帧和PPS帧》、《编解码技术:H264 - SPS》

二、删除SPS测试

由《音视频入门基础:H.264专题(2)——使用FFmpeg命令生成H.264裸流文件》中得到的H.264裸流文件output.h264用码流分析工具Elecard StreamAnalyzer打开如下:

可以看到0x271 到 0x28B的地址存放的是SPS。我们尝试把该SPS删掉,用notepad++打开output.h264,删掉SPS:

重新用Elecard StreamAnalyzer打开output.h264,发现SPS确实被删掉了:

用vlc播放该output.h264,发现播放器黑屏,无法播放,证明“没有SPS,视频将会无法解码”:

相关文章:

  • cache映射
  • 【python】OpenCV—Feature Detection and Matching
  • 速锐得解码汽车以太网技术特点接口定义数据传输及应用
  • Redis+定式任务实现简易版消息队列
  • 学习笔记——动态路由——OSPF(工作原理)
  • 安全与加密常识(0)安全与加密概述
  • Ubuntu20.04 有线网络图标消失解决方案
  • 知识图谱的构建与应用
  • JS面试题5——JS继承有哪些方式
  • Android studio Logcat 功能介绍
  • springboot中使用springboot cache
  • iOS端授权页添加自定义按钮
  • android 是Application类先运行还是AndroidManifest.xml中action先运行?Application类先运行
  • 计算机公共课面试常见问题:线性代数篇
  • 计算机视觉 | 基于图像处理和边缘检测算法的黄豆计数实验
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • angular组件开发
  • CentOS6 编译安装 redis-3.2.3
  • C学习-枚举(九)
  • js
  • leetcode98. Validate Binary Search Tree
  • magento2项目上线注意事项
  • mongo索引构建
  • node入门
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • 从0实现一个tiny react(三)生命周期
  • 第2章 网络文档
  • 订阅Forge Viewer所有的事件
  • 高度不固定时垂直居中
  • 给初学者:JavaScript 中数组操作注意点
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 记录:CentOS7.2配置LNMP环境记录
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 力扣(LeetCode)21
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 普通函数和构造函数的区别
  • 微信公众号开发小记——5.python微信红包
  • 无服务器化是企业 IT 架构的未来吗?
  • 学习HTTP相关知识笔记
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • raise 与 raise ... from 的区别
  • 阿里云服务器购买完整流程
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 容器镜像
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #{}和${}的区别?
  • #QT项目实战(天气预报)
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (1)虚拟机的安装与使用,linux系统安装