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

申请做网站东莞建设网站推广公司地址

申请做网站,东莞建设网站推广公司地址,佛山vi设计,上海网站建设电话PPS(Picture Parameter Set)详解 PPS(图像参数集)是H.264/H.265视频编码标准中的关键数据结构,与SPS(序列参数集)共同组成视频的解码配置信息,直接影响视频的正确解码和播放。以下是…

PPS(Picture Parameter Set)详解

PPS(图像参数集)是H.264/H.265视频编码标准中的关键数据结构,与SPS(序列参数集)共同组成视频的解码配置信息,直接影响视频的正确解码和播放。以下是全面解析:


1. PPS 是什么?

  • 定义
    PPS(Picture Parameter Set)是H.264/H.265码流中的一种参数集,存储单帧图像的解码参数(如熵编码模式、分片信息等)。
  • 作用
    • 为解码器提供解码单帧所需的配置信息。
    • 与SPS(序列参数集)配合,减少码流冗余(多个帧可共享同一PPS)。

2. PPS 与 SPS 的关系

参数集名称作用范围内容示例
SPS序列参数集整个视频序列分辨率、帧率、Profile/Level
PPS图像参数集单帧或一组帧熵编码模式、分片数量、QP偏移量

PPS中包含的解码关键参数:

  1. 熵编码模式

    • entropy_coding_mode_flag
      • 0:使用CAVLC(简单场景)。
      • 1:使用CABAC(高效压缩,但计算复杂)。
  2. 分片(Slice)控制

    • num_slice_groups_minus1:分片组数量(通常为0,表示不分片)。
    • slice_group_map_type:分片组的映射方式。
  3. 量化参数(QP)

    • pic_init_qp_minus26:初始QP值(影响图像质量与码率)。
    • chroma_qp_index_offset:色度分量的QP偏移量。
  4. 去块滤波(Deblocking Filter)

    • deblocking_filter_control_present_flag:是否启用去块滤波。

3. PPS 在码流中的位置

  • 存储位置

    • 通常位于视频文件的头部(如MP4的moov盒子中)。
    • 在直播或流媒体中,可能周期性重复插入(防止丢包导致无法解码)。
  • 查看方法
    使用 ffprobe 提取H.264/H.265的PPS信息:

    ffprobe -v error -show_data -show_packets -select_streams v test.h264 | grep "PPS"
    

4. 为什么PPS很重要?

(1) 解码依赖

  • 解码器必须获取PPS才能正确解析帧数据。若丢失PPS,会导致花屏或解码失败。
  • 示例
    直播中若丢失PPS包,后续视频帧可能无法解码,直到收到新的PPS。

(2) 码流优化

  • 通过调整PPS参数(如QP值),可平衡视频质量与压缩率。
  • 动态PPS
    某些编码器允许在视频中动态更新PPS(适应场景变化)。

(3) 容错性

  • 在H.264的Baseline Profile中,PPS/SPS需频繁重复发送,提升抗丢包能力。

SPS(Sequence Parameter Set)详解

SPS(序列参数集)是H.264/H.265视频编码标准中的核心元数据,存储视频流的全局解码参数,是解码器正确解析视频的基础。以下是深度解析:


1. SPS的作用
  • 定义视频流的全局属性
    包括分辨率、帧率、编码档次(Profile)、级别(Level)等。
  • 提供解码器的初始化配置
    解码器必须先读取SPS,才能正确解析后续的PPS和视频帧数据。
  • 与PPS协同工作
    SPS(全局参数) + PPS(帧级参数) = 完整的解码配置。

2. SPS包含的关键参数
参数说明
profile_idc编码档次(如Baseline、Main、High Profile),决定支持的编码工具。
level_idc级别(如3.1、4.0),限制最大分辨率、帧率和码率。
pic_width/height视频分辨率(需通过计算得出,见下文)。
log2_max_frame_num帧编号的最大比特数,影响GOP(关键帧间隔)长度。
chroma_format色度采样格式(如4:2:0、4:4:4)。
bit_depth像素位深(8bit、10bit)。
vui_parameters视频可用性信息(如帧率、色彩空间、宽高比)。

3. 如何从SPS计算分辨率?

SPS中的分辨率通过以下参数间接表示:

width  = (pic_width_in_mbs_minus1 + 1) * 16;
height = (pic_height_in_map_units_minus1 + 1) * 16 * (2 - frame_mbs_only_flag);
  • 示例
    pic_width_in_mbs_minus1=44,则宽度为 (44+1)*16 = 720

4. SPS在码流中的位置
  • 存储位置

    • 文件格式(如MP4):存储在moov盒子的avcC/hvcC中。
    • 裸流(H.264 Annex B):以NALU单元形式存在,NALU类型为7(H.264)或33(H.265)。
  • 查看方法
    使用FFmpeg提取SPS:

    ffmpeg -i input.mp4 -c:v copy -bsf:v trace_headers -f h264 - 2>&1 | grep "SPS"
    

5. SPS与PPS的关系
特性SPSPPS
作用范围整个视频序列单帧或一组帧
主要内容分辨率、Profile/Level熵编码模式、QP值、分片信息
NALU类型7(H.264)、33(H.265)8(H.264)、34(H.265)
依赖关系PPS引用SPS(通过pps_id帧数据引用PPS

PPS与SPS的组织

PPS(Picture Parameter Set)和SPS(Sequence Parameter Set)在H.264/H.265视频码流中通过严格的二进制语法结构存储,其物理组织分为 逻辑结构存储格式 两部分。


1. 逻辑结构:NALU单元

PPS和SPS在码流中以 NALU(Network Abstraction Layer Unit) 的形式存在,每个NALU包含独立的参数集数据。

组件说明
NALU Header1字节,包含类型标识(NALU Type)和其他控制位。
NALU Payload存储PPS/SPS的实际参数数据,采用 指数哥伦布编码(Exp-Golomb)
  • NALU类型标识
    • H.264:SPS=7,PPS=8
    • H.265:VPS=32,SPS=33,PPS=34

2. 存储格式
(1) Annex B格式(裸流)

常见于.h264/.h265裸流文件或直播流,通过 起始码(Start Code) 分隔NALU:

0x00000001 [NALU Header] [Payload]  // SPS
0x00000001 [NALU Header] [Payload]  // PPS
0x00000001 [NALU Header] [Payload]  // 视频帧数据
  • 起始码0x00000001(4字节)或0x000001(3字节)。
(2) AVCC格式(MP4容器)

MP4等容器将PPS/SPS存储在 avcC(H.264)或hvcC(H.265)盒子 中,结构如下:

moov
├── trak
│   └── mdia
│       └── minf
│           └── stbl
│               └── avcC (Box)
│                   ├── configurationVersion (1字节)
│                   ├── AVCProfileIndication (1字节, Profile)
│                   ├── profile_compatibility (1字节)
│                   ├── AVCLevelIndication (1字节, Level)
│                   ├── lengthSizeMinusOne (1字节, NALU长度字段大小)
│                   ├── numOfSPS (1字节, SPS数量)
│                   ├── SPS数据 (变长)
│                   ├── numOfPPS (1字节, PPS数量)
│                   └── PPS数据 (变长)
  • SPS/PPS数据:以长度前缀(通常2字节) + NALU Payload形式存储,无起始码

3. PPS/SPS的二进制语法

以H.264的SPS为例,其Payload按以下顺序组织(部分字段):

profile_idc (8bit) → constraint_flags (3bit) → level_idc (8bit) → seq_parameter_set_id (Exp-Golomb)
→ log2_max_frame_num_minus4 (Exp-Golomb) → pic_order_cnt_type (Exp-Golomb)
→ num_ref_frames (Exp-Golomb) → gaps_in_frame_num_value_allowed_flag (1bit)
→ pic_width_in_mbs_minus1 (Exp-Golomb) → pic_height_in_map_units_minus1 (Exp-Golomb)
→ frame_mbs_only_flag (1bit) → direct_8x8_inference_flag (1bit)
→ frame_cropping_flag (1bit) → vui_parameters_present_flag (1bit) → ...
  • Exp-Golomb编码:用于压缩变长整数(如pic_width_in_mbs_minus1)。

4. PPS/SPS的引用关系
  • 层级依赖

    SPS
    PPS
    Slice
    • 每个PPS通过seq_parameter_set_id关联到对应的SPS。
    • 每个视频Slice通过pic_parameter_set_id关联到PPS。
  • 多组PPS/SPS
    一个视频流可能包含多组PPS/SPS(例如动态调整QP参数),通过ID区分。


5. 工具验证
(1) 提取NALU
ffmpeg -i input.mp4 -c:v copy -bsf:v trace_headers -f h264 - 2>&1 | grep -A 10 "SPS\|PPS"
(2) 解析二进制内容

使用h264_analyzerElecard StreamEye工具可视化参数:

SPS NALU:profile_idc: 100 (High)level_idc: 31 (3.1)pic_width_in_mbs: 45 → 720x1280chroma_format_idc: 1 (4:2:0)

在RTSP视频流中,PPS(Picture Parameter Set)和SPS(Sequence Parameter Set)的组织方式直接影响视频流的解码和播放。以下是RTSP流中PPS/SPS的详细组织方式和传输机制:


rtsp视频流的组织

1. RTSP流中PPS/SPS的传输方式

RTSP(Real-Time Streaming Protocol)通常通过RTP(Real-time Transport Protocol)封装H.264/H.265视频流。PPS和SPS的传输分为两种模式:

(1) 内联模式(In-Band)
  • 特点:PPS/SPS与视频帧数据混合在RTP包中传输。
  • 触发条件
    • 首次连接时发送。
    • 关键帧(IDR帧)前必须附带PPS/SPS。
    • 动态参数变更时(如分辨率调整)。
  • RTP包类型
    • SPS:NALU类型=7(H.264)或33(H.265)。
    • PPS:NALU类型=8(H.264)或34(H.265)。
(2) 外联模式(Out-of-Band)
  • 特点:通过SDP(Session Description Protocol)在RTSP的DESCRIBE响应中传递PPS/SPS。
  • SDP示例
    a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAH6zZQFAFuhAAAAMAEAAAAwPI8YMQ,aO48sA==;
    
    • sprop-parameter-sets:Base64编码的SPS(第一个参数)和PPS(第二个参数)。
    • packetization-mode=1:表示使用分片传输模式(需内联PPS/SPS)。

2. RTP封装的PPS/SPS格式

(1) 单NALU模式(Packetization Mode 0)
  • 规则:每个RTP包仅包含一个完整的NALU(包括PPS/SPS)。
  • 示例
    RTP Header | NALU Header (0x67) | SPS Payload
    RTP Header | NALU Header (0x68) | PPS Payload
    
(2) 分片模式(Packetization Mode 1)
  • 规则:PPS/SPS作为独立的NALU发送,视频帧可能分片。
  • 要求
    • 关键帧前必须发送PPS/SPS(通常组合为一个RTP包)。
    • 使用**STAP-A(Single-Time Aggregation Packet)**封装多个NALU:
      RTP Header | STAP-A Header (0x78) | NALU1 Size | NALU1 (SPS) | NALU2 Size | NALU2 (PPS)
      
(3) 关键帧前的PPS/SPS
  • 标准做法:在IDR帧前发送SPS + PPS + IDR的组合包:
    [RTP Packet 1]: SPS
    [RTP Packet 2]: PPS
    [RTP Packet 3]: IDR Frame (分片)
    

3. 实际抓包分析

通过Wireshark捕获RTSP流,可以看到PPS/SPS的传输逻辑:

  1. RTSP DESCRIBE响应:SDP中携带Base64编码的PPS/SPS。
  2. RTP流
    • 首个视频包为SPS(NALU类型7)。
    • 第二个包为PPS(NALU类型8)。
    • 后续为视频帧数据(分片或完整NALU)。

4. 常见问题与解决

(1) 播放器报错"No SPS/PPS"
  • 原因:RTSP流未正确发送或SDP未包含PPS/SPS。
  • 解决
    • 检查服务器配置,确保关键帧前发送PPS/SPS。
    • 在SDP中强制声明参数集:
      a=fmtp:96 sprop-parameter-sets=Z2QAH6zZQFAFuhAAAAMAEAAAAwPI8YMQ,aO48sA==;
      
(2) 动态分辨率切换
  • 处理:分辨率变化时,需重新发送新的SPS/PPS。
  • 实现:通过RTSP的SET_PARAMETER请求通知客户端参数更新。

5. 代码示例(FFmpeg推流)

使用FFmpeg推送带PPS/SPS的RTSP流:

ffmpeg -re -i input.mp4 -c:v copy -f rtsp -rtsp_transport tcp rtsp://server/live.stream
  • -c:v copy:保留原始SPS/PPS。
  • -rtsp_transport tcp:确保参数集可靠传输。

6. 总结

关键点RTSP中的实现方式
首次传输通过SDP(Out-of-Band)或首个RTP包(In-Band)发送。
关键帧关联每个IDR帧前必须附带PPS/SPS。
封装格式单NALU、STAP-A或分片模式,依赖packetization-mode
动态更新通过SDP或新的RTP包组通知客户端。
容错要求需周期性重复发送(尤其直播场景),避免新观众无法解码。

如果需要验证具体流的PPS/SPS组织,可通过Wireshark抓包或FFmpeg日志分析:

ffmpeg -i rtsp://server/stream -c:v copy -bsf:v trace_headers -f null - 2>&1 | Select-String "SPS\|PPS"

Wireshark抓包分析

1.过滤 RTSP/RTP 流量

  • 基础过滤语法

    rtsp || rtp || udp.port == 554
    
    • rtsp:过滤 RTSP 控制协议(如 DESCRIBE/SETUP/PLAY)。
    • rtp:过滤 RTP 媒体流。
    • udp.port == 554:RTSP 默认端口(TCP/UDP 554)。
  • 精确过滤(按流地址):

    ip.addr == 192.168.1.100 && (rtsp || rtp)
    
触发视频流
  • 在播放器或设备中发起 RTSP 连接(如 rtsp://192.168.1.100/live)。

2. 定位 PPS/SPS

(1) 通过 SDP 获取(DESCRIBE 响应)
  1. 查找 RTSP DESCRIBE 请求的响应包(200 OK)。
  2. 展开报文中的 SDP 部分,定位 sprop-parameter-sets
    a=fmtp:96 sprop-parameter-sets=Z2QAH6zZQFAFuhAAAAMAEAAAAwPI8YMQ,aO48sA==;
    
    • Base64 解码
      • 第一个参数是 SPS(Z2QAH6zZQFAFuhAAAAMAEAAAAwPI8YMQ)。
      • 第二个参数是 PPS(aO48sA==)。
(2) 通过 RTP 包获取
  1. 过滤 RTP 包:
    rtp && rtp.payloadtype == 96  // 96 是常见的动态负载类型
    
  2. 查找 NALU 类型
    • SPS:RTP 负载首字节 0x67(H.264)或 0x42 0x01(H.265 SPS,NALU 类型=33)。
    • PPS:RTP 负载首字节 0x68(H.264)或 0x42 0x02(H.265 PPS,NALU 类型=34)。
  3. 关键帧前必带 PPS/SPS
    • 在 IDR 帧(关键帧)前的 RTP 包中,通常会连续出现 SPS → PPS → IDR。

4. 分析示例

(1) Wireshark 中的关键字段
  • RTP 头
    • Payload Type:96(动态负载类型)。
    • Sequence Number:检查丢包。
    • Timestamp:同步音视频。
  • RTP 负载
    • NALU 头:首字节的低 5 位表示类型(如 7=SPS,8=PPS)。
    • 负载数据:SPS/PPS 的二进制参数。
(2) 十六进制解析

右键点击 RTP 包 → “Show Packet Bytes” → 查看负载部分:

67 64 00 1E AC D9 40 ...  // SPS (0x67)
68 E9 7B 1C ...           // PPS (0x68)
65 88 80 ...              // IDR Frame (0x65)

5. 高级技巧

(1) 解码参数集
  • 使用 h264_parse 工具(FFmpeg 内置)解析 SPS/PPS:
    ffmpeg -hide_banner -i input.h264 -c:v copy -bsf:v trace_headers -f null - 2>&1 | grep -A 10 "SPS\|PPS"
    
(2) 过滤关键帧
  • 查找 IDR 帧(NALU 类型=5):
    rtp.payload[0] & 0x1F == 5  // H.264 IDR
    
(3) 保存特定流
  • 右键点击目标 RTP 流 → “Decode As” → 选择 RTP → 导出为 .pcap 文件。

6. 常见问题

(1) 抓不到 RTP 包
  • 原因:可能走了 TCP 传输(如 RTSP over TCP)。
  • 解决:过滤 TCP 流量:
    tcp.port == 554 || tcp.payload contains "RTP/AVP"
    
(2) SPS/PPS 不完整
  • 解决:检查是否在 IDR 帧前发送,或通过 SDP 补充。

7. 总结

步骤操作
1. 抓包选择网卡 → 开始捕获 → 过滤 `rtsp
2. 定位 PPS/SPS通过 SDP 或 RTP 包(NALU 类型 7/8)。
3. 分析关键帧确认 IDR 帧前是否有 SPS → PPS → IDR 的顺序。
4. 调试工具Wireshark 十六进制视图 + FFmpeg 解析。

通过此方法,可以精准捕获并验证 RTSP 流中 PPS/SPS 的组织方式,确保解码器能正确初始化。


文章转载自:

http://fASn693t.zpstm.cn
http://8cziyaBj.zpstm.cn
http://Be0AghCS.zpstm.cn
http://ZGoE3p3F.zpstm.cn
http://YLsmY5Ab.zpstm.cn
http://yK6msIwW.zpstm.cn
http://KIRz0Gde.zpstm.cn
http://KckwkWeP.zpstm.cn
http://MYd5Etcr.zpstm.cn
http://tYnUDjOy.zpstm.cn
http://i1IDvFib.zpstm.cn
http://cn4eiUtn.zpstm.cn
http://0n6nR0ln.zpstm.cn
http://RcAb4GVN.zpstm.cn
http://RLRMDHqm.zpstm.cn
http://qov08J7t.zpstm.cn
http://EU2SyvkJ.zpstm.cn
http://XyZJuRBH.zpstm.cn
http://bTRpqzP5.zpstm.cn
http://f6YIFpjw.zpstm.cn
http://s1MIri2i.zpstm.cn
http://Qlxpfhcw.zpstm.cn
http://FN22HIk7.zpstm.cn
http://YJAOd1VL.zpstm.cn
http://ZTD9ieyI.zpstm.cn
http://5cgl7zTN.zpstm.cn
http://D7LPXjU4.zpstm.cn
http://NGRtaLok.zpstm.cn
http://FdmAq64W.zpstm.cn
http://d5cmFBr2.zpstm.cn
http://www.dtcms.com/wzjs/632868.html

相关文章:

  • 网站上的缩略图怎么做清晰ih5 做视频网站
  • dede 网站地图 插件wordpress 网易云
  • 网络营销就是建立企业网站wordpress图片二级域名
  • 企业网站不被百度收录贸易网站设计
  • 网站开发线框网站开发是用什么语言
  • 百度seo培训公司东莞seo优化公司
  • 建立网站 wordpress软件开发工作稳定吗
  • 百度提交网站的入口地址做婚纱网站的步骤
  • 公司网站开发说明介绍wordpress 前端 修改
  • 网站开发教程公司手机网站排名优化
  • 软文推广网站做网站有多赚钱
  • 建立手机也可浏览的网站教程中国铁建网站
  • 合肥网站建设步骤正规网站备案代理
  • 竹子建站怎么赚钱wordpress公众号验证码
  • 邢台手机网站建设价格成都搜索优化整站优化
  • 手机网站弹出层插件有哪些网页设计中所需要的素材
  • 专业网站设计建设服务wordpress简洁设置
  • 苏宁网站建设房产网排名
  • 帝国cms网站搬家教程龙口市最新公告
  • 创美艺佳网站是谁做的域名解析到本地服务器
  • 国外做化工网站惠州市建设厅网站
  • 网站建设市场需求分析做运营需要知道素材网站
  • 百度搜索网站淘宝网店开店网站建设
  • 现在做个人网站管理咨询顾问是做什么的
  • 什么系统做购物网站好临汾网站开发
  • 石家庄网站建设模板网站所有页面只显示域名
  • 金华建站模板UE4做购物网站
  • 自营店网站建设html5移动网站制作
  • 网站建设培训哪里好网页游戏排行榜魔域
  • 网站备案单位的联系方式重庆中信建投期货有限公司