音视频开发—H264 SPS 和 PPS 参数说明

2024-06-02 04:20

本文主要是介绍音视频开发—H264 SPS 和 PPS 参数说明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 序列参数集 (SPS, Sequence Parameter Set)
        • SPS的主要内容:
      • 图像参数集 (PPS, Picture Parameter Set)
        • PPS的主要内容:
      • Slice Header 结构

在H.264视频编码标准中,SPS和PPS是关键的参数集,它们提供了解码所需的各种配置信息。它们分别存储在单独的NALU中,并用于初始化解码器的参数。

序列参数集 (SPS, Sequence Parameter Set)

SPS包含关于整个视频序列的全局参数,包括视频的分辨率、帧率、颜色空间等信息。SPS NALU的 nal_unit_type 为7。

SPS的主要内容:
  1. profile_idc (8 bits)

    • 指定编码器使用的特性集(Profile),如Baseline、Main、High等。

    如下图所示

    Profile描述了H.264编码器使用的特性集,定义了编码过程中允许使用的技术和工具。不同的Profile适用于不同的应用场景,主要包括以下几种:

    1. Baseline Profile
      • 适用于低延迟和低复杂度的应用,如视频会议、移动视频等。
      • 特点:支持I帧和P帧,不支持B帧;支持逐行扫描,不支持隔行扫描;支持基本的熵编码(CAVLC),不支持高级的CABAC。
    2. Main Profile
      • 适用于广播电视和存储等应用。
      • 特点:支持I帧、P帧和B帧;支持隔行扫描;支持高级的熵编码(CABAC),提供更高的压缩效率。
    3. High Profile
      • 适用于高清电视、蓝光光盘等高质量视频应用。
      • 特点:在Main Profile的基础上增加了8x8整数变换、更多的预测模式和量化矩阵等高级功能,进一步提高压缩效率和视频质量。

    此外,还有其他更专业的Profile,如Extended Profile、High 10 Profile、High 4:2:2 Profile、High 4:4:4 Predictive Profile等,用于特定的专业应用场景。

    在这里插入图片描述

  2. constraint_set_flags (6 bits)

    • 用于指示某些编码限制和特性。
  3. level_idc (8 bits)

    • 指定解码器的性能要求(Level),如1, 1.1, 1.2, …, 5.1等。

    不同的level对应的分辨率,帧率如下图所示

    在这里插入图片描述

  4. seq_parameter_set_id

    • 标识符,用于区分不同的SPS。
  5. log2_max_frame_num_minus4

    • 定义 MaxFrameNum 的值,即最大帧编号。
  6. pic_order_cnt_type

    • 指定帧内图像顺序计数类型。
  7. log2_max_pic_order_cnt_lsb_minus4(当 pic_order_cnt_type 为0时有效):

    • 定义 MaxPicOrderCntLsb 的值。
  8. max_num_ref_frames

    • 最大参考帧数量。
  9. gaps_in_frame_num_value_allowed_flag

    • 指示是否允许帧编号之间有空隙。
  10. frame_mbs_only_flag

    • 指示视频序列是否仅包含帧宏块(不包含场宏块)。
  11. direct_8x8_inference_flag

    • 指示是否可以在直接模式中使用8x8块。
  12. frame_cropping_flag

    • 指示是否存在帧裁剪参数。
  13. vui_parameters_present_flag

    • 指示是否存在VUI(视频可用性信息)参数。
  14. VUI参数(如果 vui_parameters_present_flag 为1):

    • 包含色彩描述、时间尺度、比特率、视频格式等额外信息。

一些补充的参数如下图所示:

在这里插入图片描述

图像参数集 (PPS, Picture Parameter Set)

PPS包含关于每个图像或图像组的具体参数,指导解码器如何处理图像数据。PPS NALU的 nal_unit_type 为8。

PPS的主要内容:
  1. pic_parameter_set_id
    • 标识符,用于区分不同的PPS。
  2. seq_parameter_set_id
    • 关联的SPS的标识符。
  3. entropy_coding_mode_flag
    • 指示是否使用CABAC(上下文自适应二进制算术编码)熵编码模式。
  4. bottom_field_pic_order_in_frame_present_flag
    • 指示是否在帧内包含底部场顺序信息。
  5. num_slice_groups_minus1
    • 指定切片组的数量。
  6. slice_group_map_type(如果 num_slice_groups_minus1 > 0):
    • 指定切片组的映射类型。
  7. num_ref_idx_l0_default_active_minus1 和 num_ref_idx_l1_default_active_minus1
    • 指定参考帧列表的默认数量。
  8. weighted_pred_flag
    • 指示是否使用加权预测。
  9. weighted_bipred_idc
    • 指定双向预测中加权预测的方法。
  10. pic_init_qp_minus26
    • 初始量化参数(QP)相对于基准值26的偏移量。
  11. deblocking_filter_control_present_flag
    • 指示是否存在去块滤波参数。
  12. constrained_intra_pred_flag
    • 指示是否限制帧内预测。
  13. redundant_pic_cnt_present_flag
    • 指示是否存在冗余图像计数。

Slice Header 结构

Slice Header的结构因Slice类型(I-Slice, P-Slice, B-Slice)和某些参数的不同而略有变化。以下是Slice Header中主要字段的详解:

  1. first_mb_in_slice
    • 表示该Slice中第一个宏块的地址(从0开始)。
  2. slice_type
    • 指示Slice的类型(I-Slice, P-Slice, B-Slice等)。
    • 常见值包括:
      • 0:P-Slice
      • 1:B-Slice
      • 2:I-Slice
      • 3:SP-Slice
      • 4:SI-Slice
  3. pic_parameter_set_id
    • 指示用于该Slice的PPS的标识符。
  4. frame_num
    • 表示该Slice所属帧的帧编号。
  5. field_pic_flag(可选)
    • 指示是否为场图像(field picture)。
    • 当场图像存在时,还需要bottom_field_flag
  6. bottom_field_flag(可选)
    • 指示是否为底场(bottom field)。
  7. idr_pic_id(当Slice为IDR片时)
    • 表示IDR片的标识符。
  8. pic_order_cnt_lsb
    • 表示该Slice所属帧的图像顺序计数(LSB部分)。
  9. delta_pic_order_cnt_bottom(当pic_order_cnt_type为0时)
    • 用于计算图像顺序计数的底部增量。
  10. delta_pic_order_cnt[0] 和 delta_pic_order_cnt[1](当pic_order_cnt_type为1时)
    • 用于计算图像顺序计数的增量。
  11. redundant_pic_cnt
    • 表示冗余图像计数。
  12. direct_spatial_mv_pred_flag(当Slice类型为B-Slice时)
    • 指示是否使用直接空间运动矢量预测。
  13. num_ref_idx_active_override_flag
    • 指示是否覆盖PPS中参考索引的默认数量。
  14. num_ref_idx_l0_active_minus1 和 num_ref_idx_l1_active_minus1
    • 指示L0和L1列表中活动参考索引的数量减1。
  15. ref_pic_list_modification_flag_l0 和 ref_pic_list_modification_flag_l1
    • 指示是否修改参考图像列表。
  16. dec_ref_pic_marking
    • 包含参考图像标记信息,用于管理参考图像缓存。
  17. cabac_init_idc
    • 表示CABAC初始化索引。
  18. slice_qp_delta
    • 表示该Slice的量化参数(QP)的增量。
  19. sp_for_switch_flag(当Slice类型为SP-Slice时)
    • 指示是否为切换SP-Slice。
  20. slice_qs_delta(当Slice类型为SP-Slice或SI-Slice时)
    • 表示该Slice的QS(量化步长)的增量。
  21. disable_deblocking_filter_idc
    • 指示是否禁用去块滤波。
  22. slice_alpha_c0_offset_div2 和 slice_beta_offset_div2
    • 表示去块滤波器的α和β参数偏移量。
  23. slice_group_change_cycle
    • 指示切片组更改周期。

这篇关于音视频开发—H264 SPS 和 PPS 参数说明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1023014

相关文章

Before和BeforeClass的区别及说明

《Before和BeforeClass的区别及说明》:本文主要介绍Before和BeforeClass的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Before和BeforeClass的区别一个简单的例子当运行这个测试类时总结Before和Befor

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

如何基于Python开发一个微信自动化工具

《如何基于Python开发一个微信自动化工具》在当今数字化办公场景中,自动化工具已成为提升工作效率的利器,本文将深入剖析一个基于Python的微信自动化工具开发全过程,有需要的小伙伴可以了解下... 目录概述功能全景1. 核心功能模块2. 特色功能效果展示1. 主界面概览2. 定时任务配置3. 操作日志演示

JavaScript实战:智能密码生成器开发指南

本文通过JavaScript实战开发智能密码生成器,详解如何运用crypto.getRandomValues实现加密级随机密码生成,包含多字符组合、安全强度可视化、易混淆字符排除等企业级功能。学习密码强度检测算法与信息熵计算原理,获取可直接嵌入项目的完整代码,提升Web应用的安全开发能力 目录