HEVC/H265帧类型判断及NALU TYPE介绍

H265帧类型详解

1.H265-NALU-Type介绍

NAL_TRAIL_N = 0, 
NAL_TRAIL_R = 1, 
NAL_TSA_N = 2, 
NAL_TSA_R = 3, 
NAL_STSA_N = 4, 
NAL_STSA_R = 5, 
NAL_RADL_N = 6, 
NAL_RADL_R = 7, 
NAL_RASL_N = 8, 
NAL_RASL_R = 9, 
NAL_BLA_W_LP = 16, 
NAL_BLA_W_RADL = 17, 
NAL_BLA_N_LP = 18, 
NAL_IDR_W_RADL = 19, 
NAL_IDR_N_LP = 20, 
NAL_CRA_NUT = 21, 
NAL_VPS = 32, 
NAL_SPS = 33, 
NAL_PPS = 34, 
NAL_AUD = 35, 
NAL_EOS_NUT = 36, 
NAL_EOB_NUT = 37, 
NAL_FD_NUT = 38, 
NAL_SEI_PREFIX = 39, 
NAL_SEI_SUFFIX = 40,

 

2.H264和H265获取帧类型/NALU类型的区别


H264获取方式为 code&0x1f 取低5位,如00 00 00 01 65 则65&0x1f=5表示IDR帧
H265获取方式为 (code & 0x7E)>>1 , 如00 00 00 01 40 则(40&0x7e)>>1 = 32--vps

3.H265中帧类型的介绍GOP等


细节可查看此博客:

获取H.265/HEVC 码流中 Slice Type 类型的代码示例如下: ```c++ #include <stdio.h> #define MAX_SLICE_NUM 1024 // NALU类型 typedef enum { NALU_TYPE_SLICE = 1, NALU_TYPE_IDR = 5, NALU_TYPE_SPS = 7, NALU_TYPE_PPS = 8, } NaluType; // slice类型 typedef enum { SLICE_TYPE_B = 0, SLICE_TYPE_P = 1, SLICE_TYPE_I = 2, } SliceType; int main(int argc, char *argv[]) { // 打开码流文件 FILE *fp = fopen("test.h265", "rb"); if (!fp) { printf("Open file failed!\n"); return -1; } // 初始化变量 int nalu_len = 0; unsigned char nalu_header[4] = {0x00, 0x00, 0x00, 0x01}; // NALU头 unsigned char slice_header[4] = {0x00, 0x00, 0x00, 0x01}; // Slice头 unsigned char buffer[MAX_SLICE_NUM] = {0}; int buffer_len = 0; int slice_type = -1; // 循环读取NALU while (!feof(fp)) { // 读取NALU长度 if (fread(&nalu_len, 4, 1, fp) != 1) { break; } // 读取NALU fread(buffer, 1, nalu_len, fp); // 获取NALU类型 int nalu_type = buffer[0] & 0x1f; // 如果是Slice类型,则获取Slice Type if (nalu_type == NALU_TYPE_SLICE || nalu_type == NALU_TYPE_IDR) { // 获取Slice头 unsigned char *slice_start = buffer; while (slice_start < buffer + nalu_len) { if (slice_start[0] == 0x00 && slice_start[1] == 0x00 && slice_start[2] == 0x00 && slice_start[3] == 0x01) { break; } slice_start++; } if (slice_start >= buffer + nalu_len - 4) { continue; } // 获取Slice Type slice_type = slice_start[4] % 5; // 输出Slice Type printf("Slice Type: %d\n", slice_type); } } // 关闭文件 fclose(fp); return 0; } ``` 上述代码通过循环读取NALU判断NALU类型是否为 Slice 类型,如果是,则从NALU中获取 Slice Type 类型。其中,Slice Type 类型定义如下: - 0:B slice - 1:P slice - 2:I slice 需要注意的是,在 H.265/HEVC 码流中,Slice Type 类型可能存在于 Slice Header 中的第一个字节的后 5 位。因此,需要先找到 Slice Header 的起始位置,再从中获取 Slice Type
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值