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

【H264视频编码】一、基本概念

文章目录

  • 1、压缩比(约1/100)
  • 2、GOP
    • 2.1 GOP基本概念
    • 2.2 GOP 的关键参数
      • 2.2.1 GOP 长度(GOP Size)
      • 2.2.2 GOP 结构(GOP Pattern)
  • 3、I/P/B帧
    • 3.1 I帧(Intra-coded Frame,帧内编码帧)
      • 3.1.1 IDR帧:Instantaneous Decoding Refresh
    • 3.2 P帧(forword Predicted frame,向前参考帧)
    • 3.3 B帧(Bi-directional Frame,双向预测帧)
    • 3.4 三者的对比
  • 4、SPS与PPS
    • 4.1 SPS:(Sequence Parameter Set) 序列参数集
    • 4.2 PPS:(Picture Parameter Set) 图像参数集
    • 4.3 SPS与PPS的关系
  • 5、PTS与DTS
    • 5.1 基本概念
    • 5.2 为什么需要PTS和DTS?
    • 5.3 PTS与DTS的生成与存储

1、压缩比(约1/100)

压缩比受多种因素影响,通常可以达到 20:1 到 100:1 甚至更高,具体取决于编码配置和视频内容。

(1)压缩比范围

  • 典型场景

    • 无损压缩:约 2:1(H.264也支持无损模式,但压缩比较低)。
    • 有损压缩:
      • 普通视频(如影视、会议):50:1 ~ 100:1(例如1080p视频从原始RGB的1.2Gbps压缩到2~10Mbps)。
      • 高动态/复杂场景:20:1 ~ 50:1(如体育赛事、快速动作画面)。
      • 低动态/简单场景:100:1 以上(如静态幻灯片或动画)。
  • 对比原始数据

    • 未压缩的1080p@30fps视频(8-bit YUV 4:2:0)约需(RGB数据:1920x1080x30x8x3≈1.49Gbps,YUV420数据:1920x1080x30x8x1.5≈746Mbps) 1.2Gbps,经H.264编码后可降至:
      • 高质量:5~10 Mbps(压缩比约120:1 ~ 240:1)。
      • 流媒体/在线视频:2~5 Mbps(压缩比约240:1 ~ 600:1)。
      • 低码率场景:1 Mbps以下(压缩比可达1000:1以上,但画质显著下降)。

(2)影响压缩比的关键因素

  • 编码配置

    • 帧间预测(Inter-frame):利用时间冗余(如P帧/B帧),大幅提升压缩比。
    • 帧内预测(Intra-frame):仅压缩空间冗余(如I帧),压缩比低于帧间预测。
    • GOP结构:长GOP(如IPPP)比短GOP(如IBBP)压缩效率更高,但对随机访问不友好。
    • 量化参数(QP):QP值越高,压缩比越大,但画质损失更明显。
  • 视频内容特性

    • 空间冗余:静态背景(如新闻播报)比复杂纹理(如森林)更易压缩。
    • 时间冗余:低运动视频(如讲座)比高运动(如足球赛)压缩比更高。
    • 分辨率与帧率:高分辨率视频(如4K)通过下采样可进一步提高压缩效率。
  • 编码工具

    • CABAC(熵编码):比CAVLC提升约10%~15%的压缩率。
    • 多参考帧与宏块划分:灵活划分(16x16到4x4)优化压缩效率。

(3)与其他编码标准的对比

  • H.264 vs. H.265(HEVC):
    H.265在相同画质下可比H.264提升约30%~50%的压缩比,但计算复杂度更高。

  • H.264 vs. VP9/AV1:
    AV1在低码率下比H.264提升约30%以上,但兼容性和编码速度较差。

(4)实际应用中的压缩比示例

应用场景原始数据速率H.264编码后码率压缩比
蓝光视频(1080p)1.2 Gbps20~40 Mbps30:1~60:1
YouTube 1080p(高清)1.2 Gbps4~8 Mbps150:1~300:1
视频会议(720p)0.5 Gbps1~2 Mbps250:1~500:1
监控视频(低运动)0.3 Gbps0.5~1 Mbps300:1~600:1

2、GOP

GOP(Group of Pictures,图像组)是视频编码中的一个核心概念,它定义了视频序列中 I帧、P帧、B帧 的排列方式,直接影响压缩效率、随机访问能力和错误恢复能力。

  • 实际 GOP 长度因应用程序而异,但通常在 0.5 – 2 秒范围内。
  • GOP的排列顺序和参数设置直接影响压缩率与画质平衡,例如IBBPBBP结构通过混合帧类型降低冗余数据。在360度全景视频等场景中,GOP通过分片传输与交织同步技术优化带宽利用率和解码效率

2.1 GOP基本概念

(1)什么是 GOP?

  • 定义:GOP 是一组连续的、强相关的视频帧。
    • GOP 是视频编码中通过 I/P/B 帧的预测关系实现压缩的基本单元,其结构由 N(长度)M(B帧密度)开放/封闭性 共同决定。
    • 标准定义(H.264/H.265)
      • H.264:
        • 默认封闭GOP,可通过 flags +cgop 强制。
        • B帧不跨GOP参考。
      • H.265:
        • 默认开放GOP(open-gop=1),B帧可跨GOP参考。
        • 支持 leading pictures 管理跨GOP依赖。
  • 作用: 通过帧间预测减少冗余数据,同时平衡 随机访问能力 和 压缩效率。
    • 控制压缩效率:通过帧间预测(P/B帧)减少冗余数据。
    • 支持随机访问:I帧作为“入口点”,允许解码器从任意 GOP 开始解码。
    • 错误恢复:GOP 越短,错误传播范围越小(如直播场景)。

(2)GOP 的典型结构
一个 GOP 通常由以下帧类型组成:

帧类型全称特点
I帧Intra-coded关键帧,独立编码(帧内编码),不依赖其他帧,占用空间大,但可独立解码
P帧Predictive参考前一帧(I或P帧)进行运动补偿(帧间编码),压缩率比I帧高
B帧Bi-predictive参考前后两帧(I/P帧)(帧间编码),压缩率最高,但解码延迟较大(需缓存前后帧)
  • 示例 GOP 结构(如 IBBPBBPBBPBBPIBBP…):
    I → B → B → P → B → B → P → B → B → P → ... → I(下一个GOP)
    
    在这里插入图片描述

2.2 GOP 的关键参数

2.2.1 GOP 长度(GOP Size)

  • 定义:一个 GOP 中包含的帧数。例如:
    • GOP=30:(30帧一个I帧,假设30fps,则每1秒一个I帧)。
    • GOP=250:(250帧一个I帧,约8.3秒一个I帧)
  • 影响
GOP 长度优点缺点适用场景
短 GOP(如 15~30帧)1. 支持快速随机访问
2. 错误恢复快(如直播卡顿后快速恢复)
1. 压缩率较低
2. I帧频繁,文件稍大
直播、视频会议、实时通信
长 GOP(如 100~250帧)1. 压缩率高(P/B帧占比高)
2. 文件更小
1. 随机访问延迟高
2. 错误传播范围大(如丢帧影响后续帧)
点播(如电影)、存储
  • 设置方法
    FFmpeg:-g 或 -keyint 参数

    ffmpeg -i input.mp4 -c:v libx264 -g 30 output.mp4  # GOP=30帧
    
  • 更细粒度的 GOP 结构描述方式:用 M 和 N 表示
    尤其在 H.264/H.265 编码标准 中常见。以下是详细说明:

      1. M 和 N 的定义
      参数名称含义示例(假设 N=12, M=3)
      NGOP 长度一个完整 GOP 的帧数N=12:每 12 帧插入一个 I 帧
      MI/P 帧间距两个 参考帧(I 或 P 帧) 之间的间距
      决定 B 帧的数量
      M=3:I → B → B → P → B → B → P → … → I
      1. 典型 GOP 结构示例
      • 案例 1I+B+P结构,N=12, M=3
        每 12 帧(N)一个 GOP,相邻的I/P之间间隔为3(M),即中间间隔(M-1)个B帧。

        • 帧序列
          I → B → B → P → B → B → P → B → B → P → B → B → I
          
        • 特点
          高压缩率(B 帧多),但解码复杂度高(需缓存参考帧),使用于点播(如电影)。
      • 案例 2IPPP结构,N=30, M=1
        对于30fs视频,则每秒插入一个I帧。

        • 帧序列
          I → P → P → P → ... → I
          
        • 特点
          无 B 帧(M=1),适用于低延迟场景(如直播)。
      • 案例 3I+B结构,N=30, M=30

        • 帧序列
          I → B → B → ... → B → I
          
        • 特点
          仅 I 帧和 B 帧(无 P 帧),极端情况(罕见)。
      • 案例4:全I帧(Intra-only)

        • 帧序列
          I → I → I → ...
          
        • 特点
          无压缩,文件极大,用于视频编辑母带。
      1. M 和 N 的参数关系
      • B 帧数量

        • 每两个参考帧(I/P)之间插入 M-1 个 B 帧。
        • 例如 M=3 → 每对 I/P 帧间有 2 个 B 帧(I → B → B → P)。
      • P 帧数量

        • 一个 GOP 内 P 帧数 = N/M - 1。
        • 例如 N=12, M=3 → 12/3 - 1 = 3 个 P 帧。
      1. M 和 N 对视频性能的影响

        参数组合压缩效率解码延迟随机访问适用场景
        N大,M大高(B帧多)点播(如电影)
        N小,M小直播、视频会议
        M=1(无B帧)中等最低实时通信(如WebRTC)
      1. 实际应用建议
      • 直播/低延迟N=30 ~ 60(1 ~ 2秒),M=1(无 B 帧)。

        ffmpeg -g 30 -bf 0 -sc_threshold 0 ...   # -g 30:N=30,-bf 0:M=1,-sc_threshold 0:禁用场景切换检测
        
      • 点播/高压缩N=120 ~ 250 (4~8秒),M=3(2 B 帧)。

        ffmpeg -g 250 -bf 2 -sc_threshold 40 ...  # -g 250:N=250,-bf 2:M=3,-sc_threshold 40:值越小:对画面变化的检测越敏感(更容易触发I帧插入),用于控制自动插入I帧
        
      • 视频编辑、医疗影像:N=1(全 I 帧),M=1。

        ffmpeg -intra ...
        
      1. 总结
      • N:GOP 总长度(I 帧间隔),影响随机访问和容错。
      • M:I/P 帧间距(M-1=B 帧数),影响压缩率和延迟。
      • 黄金组合
        • 直播:N=30, M=1(无 B 帧)。
        • 点播:N=250, M=3(2 B 帧)。

2.2.2 GOP 结构(GOP Pattern)

  • 1、闭合 GOP(Closed GOP):(h.264常用)

    • 定义

      • B帧仅参考当前GOP内的帧(I/P帧),不跨越GOP边界。
      • 每个GOP完全独立解码,解码时无需依赖其他GOP的数据。
      • 分界线必须是I帧(或IDR帧),通常以 IDR 帧(Instantaneous Decoding Refresh) 开头,确保解码器可以独立解码该 GOP。
    • 闭合GOP示意图
      在这里插入图片描述

    • 特点

      • 1、闭合GOP在视频流化和压缩中非常有用,它是视频中的独立片段,和其他GOP有清晰的隔断,所有在闭合GOP出现的问题都不会影响到其他GOP。
      • 2、兼容性好:所有解码器均支持,适合直播、广播等场景。
      • 3、随机访问友好:任意 GOP 均可独立解码,便于视频剪辑和跳转播放。
      • 4、错误恢复能力强:若某个 GOP 数据丢失,不影响后续 GOP 的解码。
    • 作用

      • ABR视频流: 在ABR视频流中,播放器可以根据带宽和解码器缓冲器的填充程度在不同配置文件(组合不同码率和分辨率的视频)之间切换。如果播放器要从1080p切换到360p,那么它就需要这种利落的切换。此时IDR发挥作用,这样播放器就能刷新缓冲,让360p的视频流进入。

      • 错误恢复: 如果你在流化视频时使用HLS,并且每个视频片段都以IDR开始,这意味着片段中的所有帧都不能参考前、后片段中的帧。所以如果因为某个错误而失去其中一个片段,播放器仍然能继续接收下一个视频片段。有趣的是,Apple 的 HLS 规范提到应该每两秒使用一次 IDR。(注意:规范没有说视频片段持续时间应该是两秒,而是指 GOP 的大小是两秒)。

      • 快进快退(Trick Mode): 我们之前提到过,IDR非常有助于实现快进快退。播放器需找到距离最近的IDR,然后开始从这一点播放视频流。

    • 适用场景

      • H.264/AVC 默认模式(大多数设备兼容)。
      • 直播流(如RTMP、HLS):需快速随机访问,避免解码依赖问题。
      • 视频编辑:剪辑时GOP边界清晰,避免画面撕裂。
  • 2、开放 GOP(Open GOP):(H.265/HEVC 常用)

    • 定义

      • 分界线可以是B帧或P帧
      • 开放GOP允许B帧跨GOP边界参考前一个GOP的P帧或I帧,以提高压缩效率。
    • 开放GOP示意图
      在这里插入图片描述
      从图中可以看出,GOP#2的B帧向前参考GOP1#的P帧(黄色箭头部分)。

    • 技术特征

      • 使用Non-IDR I帧(非即时解码刷新帧),允许后续GOP的B帧参考当前GOP的帧
      • 需配合**解码图片缓存(DPB)**管理参考帧
    • 优点

      • 更高的压缩率:B 帧能跨 GOP 参考,减少冗余数据。
      • 适合点播流媒体:如 Netflix、YouTube,节省带宽。
    • 缺点

      • 解码复杂度高需缓存多个 GOP 的参考帧,增加内存和延迟
      • 兼容性问题:部分旧设备(如蓝光播放器)可能不支持。
    • 适用场景

      • H.265/HEVC 编码:默认采用开放GOP,提高压缩效率。
      • 点播流媒体(DASH、MPEG-DASH):优化码率分配。
      • 高分辨率视频(4K/8K):减少存储和传输成本。
    • 开放GOP在以下情况中非常有用

      • 你不需要为了ABR而重新开始一段新的视频,但是需要关闭GOP
      • 你现在想要提高视频压缩效率(因为B帧可以多一个高质量的参考帧)
      • 当你需要插入I帧时(或是为了刷新视频质量,或者在非场景转换的情况下,是否跨I帧预测并不重要)

3、I/P/B帧

3.1 I帧(Intra-coded Frame,帧内编码帧)

  • 定义
    I帧是独立编码的帧,不依赖其他帧的信息,仅通过帧内预测(同一帧内的像素块)压缩数据。

  • 特点

    • 关键帧,采用帧内压缩技术。
    • 自包含:解码时无需参考其他帧,是视频的“关键帧”。
    • 压缩率低:因不利用时间冗余,数据量较大。
    • 随机访问点:视频播放或拖动时,播放器需先找到I帧才能解码后续帧。
  • 应用场景

    • 视频开头必须为I帧。
    • 定期插入(如每0.5-2秒一个I帧),确保容错和随机访问。

3.1.1 IDR帧:Instantaneous Decoding Refresh

及时解码刷新。我一般称它为immediate refresh ,立刻刷新,IDR帧必须是一个I帧,但是I帧不一定是IDR帧,这个帧出现的时候,是告诉解码器,可以清除掉所有的参考帧,这是一个全新的序列,新的GOP已经开始。

3.2 P帧(forword Predicted frame,向前参考帧)

  • 定义
    P帧通过参考前一帧(I帧或P帧)进行运动补偿预测编码,仅存储与参考帧的差异信息。

  • 特点

    • 采用帧间压缩技术
    • 前向预测:依赖前一参考帧(I或P帧)进行解码。
    • 压缩率中等:利用时间冗余,数据量比I帧小。
    • 累积误差:若参考帧丢失或损坏,后续P帧会解码错误。
  • 应用场景

    • 连续动态场景中,如运动视频的中间帧。

3.3 B帧(Bi-directional Frame,双向预测帧)

  • 定义
    B帧同时参考前后两个参考帧(I帧或P帧)进行双向运动补偿预测,存储前后帧的差异信息。

  • 特点

    • 采用帧间压缩技术
    • 双向预测:参考前一参考帧和后一参考帧,综合两者信息。
    • 压缩率最高:充分利用时间冗余,数据量最小。
    • 解码延迟:需先缓存并解码前后参考帧后,才能解码B帧,不适合实时传输。
  • 应用场景

    • 对延迟不敏感的场景(如本地存储、流媒体点播)。

3.4 三者的对比

特性I帧P帧B帧
依赖关系独立依赖前一参考帧依赖前后两个参考帧
压缩率中等
解码复杂度中等高(需缓存参考帧)
容错性高(不依赖其他帧)中(依赖前序帧)低(依赖前后帧)
典型用途关键帧、随机访问点连续动态场景高压缩率场景

4、SPS与PPS

SPS(Sequence Parameter Set,序列参数集) 和 PPS(Picture Parameter Set,图像参数集) 是关键的元数据单元,用于描述视频序列的全局编码参数和帧级配置。构成视频码流的头部信息,直接影响解码器的初始化和解码过程

4.1 SPS:(Sequence Parameter Set) 序列参数集

  • 作用
    SPS作用于一串连续的视频图像,包含一个视频序列(如一个GOP或整个视频)的全局编码参数,解码器需要先解析SPS才能正确解码后续帧。

  • 关键参数

参数说明
profile_idc编码配置文件(如Baseline、Main、High Profile),决定支持的编码工具。
level_idc编码等级,限制分辨率、帧率、码率等性能指标。
chroma_format_idc色度采样格式(如4:2:0、4:2:2)
pic_width/height视频的分辨率(以宏块为单位,需计算实际像素值)
log2_max_frame_num帧序号的最大比特数,影响GOP长度
num_ref_frames参考帧的最大数量,影响运动补偿的参考范围
gaps_in_frame_num_allowed是否允许帧序号不连续(用于流式传输)
帧率相关参数如time_scale和num_units_in_tick,用于计算帧率
熵编码模式使用CAVLC(Baseline)还是CABAC(High Profile)

4.2 PPS:(Picture Parameter Set) 图像参数集

  • 作用
    PPS包含单帧(或一组帧)的编码参数,通常引用SPS中的配置,但允许帧级灵活调整。

  • 关键参数

参数说明
pps_idPPS的唯一标识符,SPS通过此ID引用PPS
sps_id关联的SPS ID,指明当前PPS基于哪个SPS
熵编码模式覆盖SPS中的选择(如CABAC/CAVLC)
num_slice_groups分片组数量(用于并行解码)
weighted_pred是否启用加权预测(用于B/P帧)
deblocking_filter是否启用去块效应滤波器
QP调整参数如pic_init_qp(初始量化参数)、chroma_qp_index_offset(色度QP偏移)

4.3 SPS与PPS的关系

  • 1、层级依赖

    • SPS描述全局参数,PPS描述帧级参数,一个SPS可被多个PPS引用。
    • 解码器需先加载SPS,再通过PPS中的sps_id关联到对应的SPS。
  • 2、存储与传输

    • 在码流中,SPS/PPS通常位于 关键帧(IDR帧)之前(如H.264的NAL单元类型7/8)。
    • 在封装格式(如MP4)中,SPS/PPS存储在文件头(avcC/hvcC盒子)。
    • 实时传输(如RTP)时需单独发送SPS/PPS,避免丢包导致解码失败。
  • 3、动态更新

    • 少数场景下(如分辨率切换),SPS/PPS可能中途更新,但需保证解码器同步。

5、PTS与DTS

PTSPresentation Time Stamp,显示时间戳) 和 DTSDecoding Time Stamp,解码时间戳) 是用于同步视频播放和解码顺序的关键时间参数。

5.1 基本概念

  • 1、DTS(Decoding Time Stamp)

    • 定义
      表示视频帧 何时需要被解码解码器必须按照DTS顺序处理帧数据,否则依赖关系会破坏(例如P帧需要先解码其参考帧)。

    • 核心作用
      确保帧间预测(如P帧依赖I帧,B帧依赖前后帧)的正确性。

  • 2、PTS(Presentation Time Stamp)

  • 定义
    表示视频帧 何时需要被显示播放器根据PTS顺序渲染帧,保证视频流畅。

  • 核心作用
    解决因B帧导致解码顺序与显示顺序不一致的问题。

5.2 为什么需要PTS和DTS?

  • B帧引入的时序问题

    • B帧的双向预测特性:
      B帧需要参考前后的参考帧(如P帧或I帧),导致解码顺序和显示顺序不同。
      示例:GOP结构如下
       I-B-B-P-B-B-P
      
      显示顺序(PTS)
      I(0) B(1) B(2) P(3) B(4) B(5) P(6)
      
      解码顺序(DTS)
      I(0) P(3) B(1) B(2) P(6) B(4) B(5)
      
      解码器需先解码P帧,才能解码依赖它的B帧
  • 无B帧时
    若视频无B帧(如仅I/P帧),PTS和DTS通常相同。

5.3 PTS与DTS的生成与存储

(1) 编码器侧

  • 编码器在压缩视频时:
    • 按 显示顺序(PTS) 接收原始帧(如 I→B→B→P→B→B→P)。
    • 根据帧间依赖关系重排为 解码顺序(DTS)(如 I→P→B→B→P→B→B)。
    • 为每一帧写入PTS和DTS(通常存储在容器格式如MP4、TS的头部)。

(2) 封装格式中的存储

  • MP4:
    PTS/DTS存储在mdat盒子的Sample Table中,通过stts(时间戳表)、ctts(PTS偏移表)等字段描述。

  • TS流(MPEG-TS):
    通过PES包的头部字段携带PTS/DTS。

(3) 解码器侧

  • 解码器按DTS顺序解码帧。
  • 解码完成后,根据PTS将帧放入显示缓冲区,等待渲染。
http://www.xdnf.cn/news/1199287.html

相关文章:

  • 沪深L2逐笔十档委托队列分时Tick历史数据分析处理
  • 集合框架学习
  • day25
  • vulkan从小白到专家——YUV处理
  • Windows|CUDA和cuDNN下载和安装,默认安装在C盘和不安装在C盘的两种方法
  • 《谁在翻译机器的疼痛?》——故障诊断的认知鸿沟与产教破壁之战!
  • C++ 多线程(一)
  • 低精度训练一:低精度训练介绍与大模型下载
  • 09_opencv_遍历操作图像像素
  • net8.0一键创建支持(RabbitMQ)
  • 【AI论文】WebShaper:通过信息寻求形式化实现主动式数据合成
  • 深入理解Java内存与运行时机制:从对象内存布局到指针压缩
  • 【C++】红黑树实现
  • n8n “Run Once for All Items“和“Run Once for Each Item“区别
  • 基于Springboot+UniApp+Ai实现模拟面试小工具七:前端项目创建及框架搭建
  • cJSON在STM32单片机上使用遇到解析数据失败问题
  • Java面试全栈通关:从微服务到AI的技术深度解析
  • 一文读懂 JWT(JSON Web Token)
  • 【LeetCode刷题指南】--设计循环队列
  • 怎样让阿里云服务器(centos)有界面
  • 机械学习----knn实战案例----手写数字图像识别
  • Kotlin位运算
  • 板凳-------Mysql cookbook学习 (十二--------3_3)
  • BUG记录——Request接传Json数据中文乱码
  • Spring Boot + @RefreshScope:动态刷新配置的终极指南
  • Keepalived + LVS-DR 高可用与负载均衡实验
  • Java全栈面试实战:从JVM到AI的技术演进之路
  • OpenResty 高并发揭秘:架构优势与 Linux 优化实践
  • Unity TAA
  • CentOS网卡未被托管解决记录