视频编解码相关基础知识(二)---H.264简介
H.264编码常用参数
1.profile
profile是代表编码器能力的,一般有BP、MP、HP。越高级的profile性能需求越强。
typedef enum VENC_H264PROFILETYPE {
VENC_H264ProfileBase = 66, /* Baseline Profile*/
VENC_H264ProfileMain = 77, /* Main Profile*/
VENC_H264ProfileHigh = 100, /* High Profile*/}
2.Level
对应不同的分辨率、比特率、宏块数和帧率等。Level越高,对应的级别越大。
3.QpRange
typedef struct VencQpRange{
int nmaxqp;
int nminqp;
}vencQpRange;
Qp区间,Qp值对应量化步长的序号,对于亮度取值0-51,对于色度取值0-39。值越小,量化步长越小,量化的精度就越高,意味着同样画质的情况下,产生的数据量可能更大。Qp值每增加6,量化步长就增加1倍。
模拟信号转化为数字信号,需要有一个取值的间隔。
min qp 最小量化步长
设置X264可以使用的最小量化器。量化参数越小,输出越接近输入,使用某些值时,X264的输出可以和输入看起来完全一样,虽然其实并不是精确相同的。如果开启了自适应量化器(默认开启),则不鼓励提高qmin的值,那样可能会降低帧的平坦部分的质量。
max qp 最大量化步长
qmin的反面,设置X264可以使用的最大量化器,默认值时51。时H.264标准中的最大值,质量非常低。默认值51相当于没有设置qpmax。
4.FixQp
固定Qp参数,不使用码率控制,固定Qp。
H.264的NAL单元及码流结构
在H.264/AVC视频编码标准中,整个系统框架被分为两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质的传播,现实中传输系统时多样化的,其可靠性,服务质量,封装方式等特征各不相同。NAL这一概念的提出提供了视频编解码器和传输系统的友好接口,使得编码后的视频数据能够有效的在各种不同的网络环境中传输。
在H.264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流,以I帧开始,到下一个I帧结束。
一个序列的第一个图像叫做IDR图像图像,IDR图像都是I帧图像。H264引入IDR图像是为了解码的同步,当解码解到IDR图像时,立即将参考帧队列清空,将已解锁的数据全部输出或抛弃,重新查找参数集,开始一个新序列。
H.264码流结构
VCL:包括核心压缩引擎和块,宏块和片的语法级别定义,设计目标是尽可能的独立于网络进行高效的编码。
NAL:负责将VCL产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别。
NAL组成:NALU(Nal Unit)= NALU头 + RBSP
在VCL数据传输或存储之前,这些编码的VCL数据,先被映射或封装进NAL单元,每个NALU包括一个原始字节序列负荷(RBSP,Raw Byte Sequence Paylead),一组对应于视频编码的NALU头部信息。RBSP的基本结构是:在原始编码数据的后面添加了结尾比特。
RBSP序列举例
SPS | SEI | PPS | I片 | 图像定界符 | P片 | P片 |
SPS即"Sequence Paramater Set",又称作序列参数集。SPS中保存了一组编码视频序列的全局参数。所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中。SPS的NAL Unit 通常位于整个码流的起始位置,NAL Unit Type = 7。
PPS即"Picture Paramater Set",又称图像参数集。
H264码流:SPS + PPS + SEI +I帧
一个原始的H.264NALU单元常由[startcode] + [NAL Header] + [Unit Payload]三部分组成。
拓展2:H264的NAL Header 组成:F:forbidden_zero_bit,在H.264规范中规定这一位必须为0,禁止位0表示正常,1表示错误,一般都是0;
NRI:2个比特,nal_ref_idc,取00~11,表示这个NALU的重要性,如00的NALU的解码器可以丢弃它而不影响图像的回放;
Type:5个比特,重要的nal_unit_type,这个NAL单元的类型。
H265的NAL Header组成:(H265的NAL Header 比264多一个字节)(抛一个265格式解析链接:(H265码流分析:https://www.cnblogs.com/lidabo/p/11856799.html))
forbidden_zero_bit = 0;
nal_unit_type = 32:占6个比特,用来用以指定NALU类型;
nuh_reserved_zero_6bit = 0:占6位,预留位,要求为0,用于未来扩展或3D视频编码;
nuh_temporal_id_plus1 = 1:占3个bit,表示NAL所在的时间层ID。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现