H264编码SPS、PPS
在 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帧等数据。
SPS
SPS即Sequence Paramater Set,序列参数集。即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中。
PPS
Picture Paramater Set,图像参数集。即图像的一些参数,宽高等。
H264编解码参数说明
一、H264码流分层
1、NAL层 Network abstraction layer
如何判断帧类型(是图像参考帧还是I、P帧等)?
帧格式
SPS格式解析代码分析 ParseAndRewriteSps方法
2、 VCL层 Video codec layer
3、 码流基本概念
SODB(String Of Data Bits)
RBSP(Raw Byte Sequence Payload)
NALU 单元
SPS/PPS/Slice Header
webrtc中对应RBSP的代码 段 方法SpsVuiRewriter::ParseAndRewriteSps
二, SPS中两个重要的参数分别是 Profile 与 Level
H264 Profile
H264 Level
分辨率
帧相关的
帧数 log2_max_frame_num_minus4
参考帧数 max_num_ref_frames
显示帧序号 pic_order_cnt_type
帧率的计算
三、 PPS与 Slice Header
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数据。
小结
在 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这一概念的提出提供了一个视频编码器和传输系统的友好接口,使得编码后的视频数据能够有效的在各种不同的网络环境中传输。