C++如何解析HEVC RTSP包并从VPS/SPS/PPS中提取视频宽高参数
HEVC SPS提取视频宽高解决方案
你当前已经完成了HEVC NAL单元的识别、起始码拼接逻辑,结合你已经集成FFmpeg的前提,推荐优先用FFmpeg内置接口解析,避免手动实现比特流解析的兼容问题。
方案1:基于FFmpeg接口解析(推荐)
不需要自行处理HEVC SPS语法位,直接调用FFmpeg封装好的参数提取接口:
头文件引入
注意FFmpeg是C语言库,C++调用要加extern "C"包裹:
extern "C" { #include <libavcodec/avcodec.h> }
解析代码
在你完成SPS拼接(加完起始码、拷贝完payload)的逻辑后插入:
// 传入你已拼接好的带起始码的SPS数据、长度 const uint8_t* sps_buf = m_spsHeader; int sps_buf_size = m_spsSize; AVCodecParameters* codec_par = avcodec_parameters_alloc(); if (codec_par) { int res = avcodec_parameters_from_extradata(codec_par, AV_CODEC_ID_H265, sps_buf, sps_buf_size); if (res >= 0) { // 直接获取宽高参数 int video_width = codec_par->width; int video_height = codec_par->height; // 此处将宽高存入你的业务变量即可 } avcodec_parameters_free(&codec_par); }
方案2:纯C++手动解析(无FFmpeg依赖场景)
如果要完全自己实现解析,需按HEVC标准执行以下步骤:
- EBSP转RBSP:把SPS payload中的防竞争字节
0x03移除,规则是遇到0x00 0x00 0x03序列时,删掉第三个字节0x03 - 比特流读取:实现逐位读取的工具类,按HEVC SPS语法结构依次读取字段,直到取到
pic_width_in_luma_samples(对应视频宽度)、pic_height_in_luma_samples(对应视频高度)即可
手动解析需要处理大量语法分支、边界判断,出错概率高,非必要不推荐
注意事项
- 你当前处理FU-A分片(naltype=49)的逻辑中,要先把分片的NAL单元完全拼接完成后,再执行VPS/SPS/PPS的存储、解析操作,半截分片数据会导致解析失败
- 你的起始码拼接逻辑中,要确保
m_vpsHeader/m_spsHeader/m_ppsHeader的前3字节初始值为0,配合你赋值的第4字节为1,刚好是标准的4字节起始码0x00000001,兼容所有播放器和解析器
内容的提问来源于stack exchange,提问作者dinesh47
相关产品推荐
相关产品推荐

