前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧

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

原创
作者头像
aqi00
发布2024-06-16 12:39:44
1190
发布2024-06-16 12:39:44
举报
文章被收录于专栏:FFmpeg实战FFmpeg实战

​《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的字段定义,得到视频宽高的计算式子如下:

代码语言:javascript
复制
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。此时视频宽高的计算式子简化如下:

代码语言:javascript
复制
width = (pic_width_in_mbs_minus1+1)*16;
height = (pic_height_in_map_units_minus1+1)*16;

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

代码语言:javascript
复制
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开发实战:从零基础到短视频上线》一书。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、SPS帧
  • 二、PPS帧
  • 三、IDR帧
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档