FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧

《FFmpeg开发实战:从零基础到短视频上线》一书的“2.1.1  音视频编码的发展历程”介绍了H.26x系列的视频编码标准,其中H.264至今仍在广泛使用,无论视频文件还是网络直播,H.264标准都占据着可观的市场份额。
之所以H.264取得了巨大的成功,是因为它提出了一个新概念,把标准框架划分为两个层面,分别是视频编码层(Video Coding Layer,简称VCL)和网络抽象层(Network Abstraction Layer,简称NAL,也称网络提取层)。其中视频编码层专注如何高效地表达视频的数据内容,而网络抽象层负责格式化数据并提供头信息,以便视频内容能够适应各种环境的数据传输。
每个视频帧都包含至少一个NAL单元,对于I帧、P帧来说,因为内部数据比较多,所以可能会分为多个NAL单元。各帧的第一个NAL单元以起始码0x00000001开头,表示从这里开始是一个新帧;从第二个NAL单元开始,后继NAL单元以0x000001开头,表示其后数据是前面NAL单元的接续。
起始码往后的一个字节,代表当前帧的类型,常见的帧类型有下列六种:
0x67,类型值为7,为SPS帧,表示序列参数集。
0x68,类型值为8,为PPS帧,表示图像参数集。
0x65,类型值为5,为IDR帧,即IDR图像,也称为关键帧。
0x41,类型值为1,为SLICE分片,表示P帧。
0x01,类型值为1,为SLICE分片,表示B帧。
0x06,类型值为6,为SEI帧,表示辅助增强信息。
在上述六种类型的NAL中,前三种是必不可少的,分别详细说明如下。

一、SPS帧

SPS的全称是Sequence Paramater Set,中文叫作序列参数集。SPS保存着视频内容的规格参数,包括视频高度、视频宽度、帧率等等。SPS的详细格式在H.264标准协议中(文档的7.3.2.1部分)规定,内部各字段的取值情况如下图所示。

根据SPS的字段定义,得到视频宽高的计算式子如下:

width = ((pic_width_in_mbs_minus1 +1)*16) - frame_crop_left_offset*2 - frame_crop_right_offset*2;
height= ((2 - frame_mbs_only_flag) * (pic_height_in_map_units_minus1 +1) * 16) - (frame_crop_top_offset * 2) - (frame_crop_bottom_offset * 2);

当视频宽度和视频高度均为16的整数倍时,frame_crop_left_offset、frame_crop_right_offset、frame_crop_top_offset、frame_crop_bottom_offset这四个字段值均为0,且frame_mbs_only_flag字段值为1。此时视频宽高的计算式子简化如下:

width = (pic_width_in_mbs_minus1+1)*16;
height = (pic_height_in_map_units_minus1+1)*16;

除了视频宽高,通过SPS内部字段还能计算视频的帧率,帧率的计算式子如下:

fps = time_scale / num_units_in_tick;

二、PPS帧

PPS的全称是Picture Paramater Set,中文叫做图像参数集。PPS保存着视频帧的编码参数,包括熵编码模式、切片分割类型、初始量化参数、色度量化参数等等。PPS的详细格式在H.264标准协议中(文档的7.3.2.2部分)规定,内部各字段的取值情况如下图所示。


三、IDR帧

IDR的全称是Instantaneous Decoding Refresh,中文叫做立即解码刷新。IDR一定是I帧,但I帧不一定是IDR。一旦出现IDR,就表示清除前面的序列,并且立刻渲染当前的IDR帧。
在每个H.264流的开头,都会出现这样的序列:SPS帧→PPS帧→IDR帧→其余SLICE,并且SPS、PPS、IDR三种帧必定是搭配出现的,缺一不可,如果少了其中任何一帧,都会导致后续视频流解码异常。

更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CDLinux下载网站

CDlinux - Browse /CDlinux-ISO at SourceForge.net

9.2 字符串拼接

字符串拼接 使用运算符拼接字符串 使用加号""运算符,可将几个较小的字符串拼接成一个更大的字符串,其拼接的前后顺序严格遵循每个字符串在加法表达式中出现的顺序。 s : "北冥有鱼,其名为鲲。"s s 鲲之大&#xff0…

用神经网络预测三角形的面积

周末遛狗时,我想起一个老问题:神经网络能预测三角形的面积吗? 神经网络非常擅长分类,例如根据花瓣长度和宽度以及萼片长度和宽度预测鸢尾花的种类(setosa、versicolor 或 virginica)。神经网络还擅长一些回…

2024中青杯A题数学建模成品文章数据代码分享

人工智能视域下养老辅助系统的构建 摘要 随着全球人口老龄化的加剧,养老问题已经成为一个世界性的社会问题,对社会各个方面产生了深远影响,包括劳动力市场、医疗保健和养老金制度等。人口结构变化对养老服务的质量和覆盖面提出了更高要求。特…

Python 爬虫编写入门

一、爬虫概述 网络爬虫(Web Crawler)或称为网络蜘蛛(Web Spider),是一种按照一定规则,自动抓取互联网信息的程序或者脚本。它们可以自动化地浏览网络中的信息,通过解析网页内容,提取…

3台机器快速安装ELK集群

安装和配置 Elasticsearch、Kibana 和 Logstash 以下是安装和配置 Elasticsearch、Kibana 和 Logstash 的详细步骤,并设置开机自启。 步骤 1:修改系统参数 编辑系统参数并使其生效: vim /etc/sysctl.conf添加以下行: vm.max_…

Xpath元素定位和三大等待,三大切换

在页面的操作过程当中,都需要适当的等待。特别是: 候【发生了页面切换的时候】。而我们接下来的操作都是在变化的内容上。 代码就要等等页面的加载,等等页面的渲染。代码是非常快的,页面加载跟不 上,就需要等待。 三大…

getaway基本配置

Getaway 是一款用于容器化应用的轻量级 API 网关。它提供了一种简单的方式来管理和路由 API 请求,通常用于微服务架构中。以下是 Getaway 的基本配置指南,包括安装、配置文件示例、以及一些常见的配置选项。 ### 1. 安装 Getaway 通常通过 Docker 容器…

用友开发平台调用审核提示U8授权失败可能原因

U8授权失败可能有多种原因,这里有几个可能的解决方案供您参考: 登录接口未调用:在调用审核接口(如audit、abandon、verify、unverify)之前,请确保已经调用了登录接口(login)。如果登…

红队攻防渗透技术实战流程:云安全之云原生安全:K8s安全

红队云攻防实战 1.云原生-K8s安全-名词架构&各攻击点1.1 云原生-K8s安全-概念1.2 云原生-K8s安全-K8S集群架构解释1.2.1 K8s安全-K8S集群架构-Master节点1.2.2 K8s安全-K8S集群架构-Node节点1.2.3 K8s安全-K8S集群架构-Pod容器1.3 云原生安全-K8s安全-K8S集群攻击点 `(重点…

ARP基本原理

相关概念 ARP报文 ARP报文分为ARP请求报文和ARP应答报文,报文格式如图1所示。 图1 ARP报文格式 Ethernet Address of destination(0–31)和Ethernet Address of destination(32–47)分别表示Ethernet Address of dest…

【算法】前缀和——除自身以外数组的乘积

本节博客是用前缀和算法求解“除自身以外数组的乘积”,有需要借鉴即可。 目录 1.题目2.前缀和算法3.变量求解4.总结 1.题目 题目链接:LINK 2.前缀和算法 1.创建两个数组 第一个数组第i位置表示原数组[0,i-1]之积第二个数组第i位置表示原数组[i1,n-1]…

laravel8 JWT配置

一、安装JWT composer require tymon/jwt-auth二、config/app.php 注册服务提供者 providers > [Tymon\JWTAuth\Providers\LaravelServiceProvider::class, ]aliases > [JWTAuth > Tymon\JWTAuth\Facades\JWTAuth::class,JWTFactory > Tymon\JWTAuth\Facades\JWT…

Hadoop 客户端 FileSystem加载过程

如何使用hadoop客户端 public class testCreate {public static void main(String[] args) throws IOException {System.setProperty("HADOOP_USER_NAME", "hdfs");String pathStr "/home/hdp/shanshajia";Path path new Path(pathStr);Confi…

AWS安全性身份和合规性之Amazon Detective

分析和直观呈现安全数据,以调查潜在的安全问题。 Amazon Detective使您可以更轻松地分析、调查和快速确定潜在安全问题或可疑活动的根本原因。Amazon Detective会自动从您地AWS资源中收集日志数据并使用机器学习、统计分析和图论来构建一组关联的数据,使…

在DAYU200上实现OpenHarmony跳转拨号界面

一、简介 日常生活中,打电话是最常见的交流方式之一,那么如何在OpenAtom OpenHarmony(简称“OpenHarmony”)中进行电话服务相关的开发呢?今天我们可以一起来了解一下如何通过电话服务系统支持的API实现拨打电话的功能…

ECMAScript 详解

ECMAScript 是一种脚本语言规范,由欧洲计算机制造商协会(ECMA)通过 ECMA-262 标准化,广泛用于客户端脚本编程。它最著名的实现是 JavaScript,主要用于 Web 开发。以下是 ECMAScript 的详细解析: ### 1. 历…

C#中System.Threading.Timer的使用

文章速览 概述创建计时器对象循环执行的方法停止计时器参考文章 坚持记录实属不易,希望友善多金的码友能够随手点一个赞。 共同创建氛围更加良好的开发者社区! 谢谢~ 概述 本文着重于System.Threading.Timer的简单使用方法。 由于在实际开发过程中&…

LabVIEW机械臂自动化在精密制造中的应用

精密制造是现代工业中的关键环节,要求高精度、高效率以及一致性。机械臂自动化技术结合LabVIEW软件,提供了强大的控制、数据处理和用户界面设计能力,使其在精密制造中得到了广泛应用。以下是几个具体的应用实例: 1. 电路板焊接 …

C#-根据日志等级进行日志的过滤输出

文章速览 概要具体实施创建Log系统动态修改日志等级 坚持记录实属不易,希望友善多金的码友能够随手点一个赞。 共同创建氛围更加良好的开发者社区! 谢谢~ 概要 方便后期对软件进行维护,需要在一些关键处添加log日志输出,但时间长…