音视频开发—H264编码【SPS和PPS】

作者: 谁动了我的代码 | 来源:发表于2022-12-01 18:00 被阅读0次

    概述

    在 H.264 流中,有两种 NALU 极其重要,H264码流可以分为两层,VCL层和NAL层,NAL的全称是Network abstraction layer,叫网络抽象层,它保存了H264相关的参数信息和图像信息,NAL层由多个单元NALU组成,NALU由了NALU头(00 00 00 01或者00 00 01)、sps(序列参数集)、pps(图像参数集合)、slice、sei、IDR帧、I帧(在图像运动变化较少时,I帧后面是7个P帧,如果图像运动变化大时,一个序列就短了,I帧后面可能是3个或者4个P帧)、P帧、B帧等数据。

    H264编解码参数说明

    • 一、H264码流分层
      • 1、NAL层
        • ①、如何判断帧类型(是图像参考帧还是I、P帧等)?
        • ②、 帧格式
        • ③、 SPS格式解析代码分析 ParseAndRewriteSps方法
      • 2、 VCL层
      • 3、 码流基本概念
        • ①、 SODB(String Of Data Bits)
        • ②、 RBSP(Raw Byte Sequence Payload)
        • ③、 NALU 单元
        • ④ SPS/PPS/Slice Header
        • ⑤ webrtc中对应RBSP的代码 段 方法SpsVuiRewriter::ParseAndRewriteSps
    • 二, SPS中两个重要的参数分别是 Profile 与 Level
      • 1、 H264 Profile
      • 2、 H264 Level
      • 3、 分辨率
      • 4、 帧相关的
        • ①、 帧数 log2_max_frame_num_minus4
        • ②、 参考帧数 max_num_ref_frames
        • ③、 显示帧序号 pic_order_cnt_type
      • 5、 帧率的计算
    • 三、 PPS与 Slice Header
      • 6、Slice Header
        • ①、 帧类型
        • ②、 GOP中解码帧序号
        • ③、 预测权重
        • ④、 滤波

    sps、pps、I帧、P帧在NALU中的关系和nalu type判断

    一个完整的NALU单元结构图如下:


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

    SPS 记录了编码的 Profile、level、图像宽高等

    1、profile 主要参数:

    • 1、Baseline Profile:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;
    • 2、Extended profile:进阶画质。支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC;(用的少)
    • 3、Main profile:主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced), 也支持CAVLC 和CABAC 的支持;
    • 4、High profile:高级画质。在main Profile 的基础上增加了8x8内部预测、自定义量化、 无损视频编码和更多的YUV 格式

    H.264 Baseline profile、Extended profile和Main profile都是针对8位样本数据、4:2:0格式(YUV)的视频序列。在相同配置情况下,High profile(HP)可以比Main profile(MP)降低10%的码率。 根据应用领域的不同,Baseline profile多应用于实时通信领域,Main profile多应用于流媒体领域,High profile则多应用于广电和存储领域。


    2、Level 主要参数:

    3、fmpeg如何控制profile&level

    ffmpeg -i input.mp4 -profile:v baseline -level 3.0 output.mp4

    ffmpeg -i input.mp4 -profile:v main -level 4.2 output.mp4

    ffmpeg -i input.mp4 -profile:v high -level 5.1 output.mp4 如果ffmpeg编译时加了external的libx264,那就这么写:

    ffmpeg -i input.mp4 -c:v libx264 -x264-params "profile=high:level=3.0" output.mp4 从压缩比例来说,baseline< main < high ,对于带宽比较局限的在线视频,可能会选择high,但有些时候,做个小视频,希望所有的设备基本都能解码(有些低端设备或早期的设备只能解码baseline),那就牺牲文件大小吧,用baseline。自己取舍吧!

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

    每一帧编码后数据所依赖的参数保存于 PPS 中

    一般情况 SPS 和 PPS 的 NAL Unit 通常位于整个码流的起始位置。 封装文件一般进保存一次,位于文件头部,SPS/PPS 在整个解码过程中复用,不发生变化。 然而对于实时流,通常是从流中间开始解码,因此需要在每个I帧前添加SPS和PPS; 如果编码器在编码过程中改变了码流参数(如分辨率),需要重新调整SPS和PPS数据。

    以上就是属于音视频开发中的H264编码中的SPS和PPS学习,音视频的知识点当然是需要很广的。如果说想要进入音视频开发行业或者进阶自己音视频技术。大家可以参考《音视频开发技术精通》这个电子文档。从上方部分截图看出内容很多从基础学起。

    小结

    在 H.264 流中,有两种 NALU 极其重要

    一般情况 SPS 和 PPS 的 NAL Unit 通常位于整个码流的起始位置。 封装文件一般进保存一次,位于文件头部, SPS/PPS 在整个解码过程中复用,不发生变化。 然而对于实时流,通常是从流中间开始解码,因此需要在每个 I帧 前添加 SPS 和 PPS ; 如果编码器在编码过程中改变了码流参数(如分辨率),需要重新调整 SPS 和 PPS 数据。

    NAL ( Network Abstract Layer ),即网络抽象层 在 H.264/AVC 视频编码标准中,整个系统框架被分为了两个层面:

    视频编码层往往与网络抽象层(NAL)相互配合,标准的 NAL-unit 总共规范( Profile )有12种,这12种型式可粗分成 VCL NAL-unit 及 non-VCL NAL-unit ,其中 VCL NAL-unit 是指 NAL-unit 中存放的完全是VCL的影像资料。

    现实中的传输系统是多样化的,其可靠性,服务质量,封装方式等特征各不相同,NAL这一概念的提出提供了一个视频编码器和传输系统的友好接口,使得编码后的视频数据能够有效的在各种不同的网络环境中传输。

    相关文章

      网友评论

        本文标题:音视频开发—H264编码【SPS和PPS】

        本文链接:https://www.haomeiwen.com/subject/yxssfdtx.html