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

news2024/11/15 6:40:09

《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.coloradmin.cn/o/1685678.html

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

相关文章

完美解决原生小程序点击地图markers上的点获取不到对应的坐标信息

需求:地图上有多个markes点,点击每一个获取对应的数据,再根据当前的坐标信息去调用导航。 出现的问题:每次点击的时候获取不到对应的坐标信息,获取到的信息显然不是想要的 原因: 因为你的id不是number类型&…

线上虚拟纪念馆的便利与优势,全天候开放的数字化历史体验

一、搭建线上虚拟纪念馆的意义 在现代社会中,线上虚拟纪念馆越来越受到人们的关注和欢迎。传统纪念馆需要大量的物理空间和资源,而线上虚拟纪念馆则突破了这些限制,提供了更多的可能性和优势。首先,线上虚拟纪念馆能够更好地保存和…

【有手就行】使用你自己的声音做语音合成,CPU都能跑,亲测有效

此文介绍在百度飞桨上一个公开的案例,亲测有效。 厌倦了前篇一律的TTS音色了吗?打开短视频听来听去就是那几个声音,快来试试使用你自己的声音来做语音合成吧!本教程非常简单,只需要你能够上传自己的音频数据就可以(建议…

Mac虚拟机工具 CrossOver 24.0.0 Beta3 Mac中文版

CrossOver是一款在Mac上运行Windows应用程序的软件,无需安装虚拟机或重启计算机,简化了操作过程,提高了工作效率,为用户带来便捷体验。前往Mac青桔下载,享受前所未有的便利和高效。摘要由作者通过智能技术生成 CrossOv…

JVM严镇涛版笔记【B站面试题】

前言 2023-06-19 18:49:33 出自B站 灰灰的Java面试 枫叶云链接:http://cloud.fynote.com/s/4976 JVM面试题大全 Lecturer :严镇涛 1.为什么需要JVM,不要JVM可以吗? 1.JVM可以帮助我们屏蔽底层的操作系统 一次编译&#xff0c…

当代人工智能三教父——深度学习三巨头

文章目录 引言 人物介绍 突出贡献 专业名词解释 引言 今天下午闲来无事翻阅了一下csdn首页的头条文章——《27 岁天才创始人 Joel Hellermark 分享了自己和“AI 教父” Geoffery Hinton 的最新采访》 感觉挺有意思,就从头到尾的看了一遍,里面有很多…

6.1 if语句

计算机语言和人类语言类似,人类语言是为了解决人与人之间交流的问题,而计算机语言是为了解决程序员与计算机之间交流的问题。程序员编写的程序就是计算机的控制指令,控制计算机的运行。借助于编译工具,可以将各种不同的编程语言的…

免费分享一套微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端) Java毕业设计…

谷歌B端独立站建站推广,外贸建站训练营,傻瓜式教学

做外贸方法重要,工具更重要,而这些背后的规则和套路,身边的人往往不会告诉你,成功的人更不会教给你。本套课程主要内容包括:一套体系化的独立站建站方法,学会“高效学习”避免无效努力,拥有独立…

144.栈和队列:有效的括号(力扣)

题目描述 代码解决 class Solution { public:bool isValid(string s) {// 如果字符串长度为奇数&#xff0c;不可能是有效的括号字符串if(s.size() % 2 ! 0) return false;// 使用栈来存放括号stack<char> st;// 遍历字符串中的每一个字符for(int i 0; i < s.size();…

redis小知识

AOF与RDB的区别 AOF (Append Only File) 和 RDB (Redis Database) 都是Redis中的持久化机制&#xff0c;但有以下几点不同之处&#xff1a; 内容格式&#xff1a;AOF 以日志的形式记录所有写操作命令&#xff0c;而 RDB 则是在指定的时间间隔内对数据库进行快照&#xff0c;将数…

柏拉图式表征:人工智能深度网络模型是否趋于一致?

人工智能模型是否正在向现实的统一表征演进&#xff1f;柏拉图表征假说认为&#xff0c;人工智能模型正在趋同。 麻省理工学院最近的一篇论文引起了我的注意&#xff0c;因为它提出了一个令人印象深刻的观点&#xff1a;人工智能模型正在趋同&#xff0c;甚至跨越了不同的模态…

GeoScene产品学习视频收集

1、易智瑞运营的极思课堂https://www.geosceneonline.cn/learn/library 2、历年易智瑞技术公开课视频资料 链接&#xff1a;技术公开课-易智瑞信息技术有限公司&#xff0c;GIS/地理信息系统&#xff0c;空间分析-制图-位置智能-地图 3、一些关于GeoScene系列产品和技术操作的…

计算机-编程相关

在 Linux 中、一切都是文件、硬件设备是文件、管道是文件、网络套接字也是文件。 for https://juejin.cn/post/6844904103437582344 fork 进程的一些问题 fork 函数比较特殊、一次调用会返回两次。在父进程和子进程都会返回。 每个进程在内核中都是一个 taskstruct 结构、for…

微软MSBuild大会发布Copilot+PC:技术革新还是隐私噩梦?

微软在最近的MSBuild 2024大会上发布了全新的CopilotPC概念&#xff0c;这一技术结合了高通骁龙X Elite芯片&#xff0c;将人工智能与PC紧密结合。此次发布引起了广泛关注&#xff0c;不仅是因为其技术创新&#xff0c;还因为潜在的隐私问题。甚至连Elon Musk也对此表示担忧&am…

第197题|奇偶性的四则运算,你掌握了吗?|函数强化训练(四)|武忠祥老师每日一题 5月22日

解题思路&#xff1a;这道题如果我们会21号的题的话&#xff0c;简直是小菜一碟&#xff01;主要就是要用到下面这个结论&#xff1a; &#xff08;A&#xff09; 直接看奇偶性我们不好看&#xff0c;我们需要拆项&#xff1a; 我们先看前一项的奇偶性&#xff0c;x是奇函数&a…

自动化测试用例结构

标准的用例结构&#xff1a; 用力标题前提条件用例步骤预期结果实际结果 测试用例对比&#xff1a;

高稳定数显芯片防干扰抗噪数码屏驱动高亮LED驱动IC-VK16K33A/AA 最大13×3的按键扫描

产品型号&#xff1a;VK16K33A/AA 产品品牌&#xff1a;永嘉微电/VINKA 封装形式&#xff1a;SOP28/SSOP28 原厂&#xff0c;工程服务&#xff0c;技术支持&#xff01; 概述 VK16K33A/AA是一种带按键扫描接口的数码管或点阵LED驱动控制专用芯片&#xff0c;内部集成有数据…

MoonDream2微调指南【最小VLM】

在本指南中&#xff0c;我们将探讨如何使用计算机视觉数据集对完全开源的小型视觉语言模型 Moondream2 进行微调&#xff0c;以计数项目&#xff08;这是 GPT-4V 一直表现不一致的任务&#xff09;&#xff0c;并以一种可以依赖输出用于生产应用程序的方式进行微调。 视觉语言…

k8s之yaml文件详解

文章目录 k8s之yaml文件详解一、关于yaml文件1、k8s支持的文件格式2、YAML语言格式3、查看api资源版本标签4、编写nginx-test.yaml资源配置清单4.1 编写资源配置清单4.2 创建资源对象4.3 查看创建的pod资源 5、创建service服务对外提供访问并测试5.1 编写nginx-svc-test.yaml5.…