You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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标准执行以下步骤:

  1. EBSP转RBSP:把SPS payload中的防竞争字节0x03移除,规则是遇到0x00 0x00 0x03序列时,删掉第三个字节0x03
  2. 比特流读取:实现逐位读取的工具类,按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 08:36:03