hevc mp4 extradata中提取参数集VPS/SPS/PPS
1 背景以下场景需要将HVCC转化为Annex-B格式Android/鸿蒙 等平台视频硬件解码‌Android/鸿蒙系统的硬件解码器通常仅支持 Annex-B 格式的码流输入。若视频源为 MP4 文件或 FLV 文件默认采用 HVCC 格式封装需将其转换为 Annex-B 格式后才能正常解码播放。实时流媒体传输与直播推流‌流式传输协议如 RTMP、HLS的封装格式如 TS、PS要求视频数据以 Annex-B 格式存储。此时需将 MP4 文件中的 HVCC 码流转换为 Annex-B以适应流式协议的起始码分割规则确保接收端能够正确解析和播放。视频裸流处理与分析‌在视频编辑、转码或质量分析等场景中若需直接操作 H.265 的 NALU 单元如提取 VPS/SPS/PPS 参数或插入 SEI 信息需将 HVCC 格式转换为 Annex-B。后者通过起始码分隔 NALU便于实现流的分割和重组。跨平台兼容性适配‌部分硬件解码器如某些嵌入式设备或旧版本解码芯片仅支持 Annex-B 格式输入。若视频源为 HVCC 封装需预先转换以兼容目标设备的解码能力。以上HVCC转 Annex-B 场景中当数据帧是IDR帧时需要将参数集VPS/SPS/PPS在IDR前拷贝到解码器输入缓存中才能正常解码。本文讲解extradata语法以及如何从mp4/mkv/mov等容器中提取参数集VPS/SPS/PPS。2 HVCC和Annex-B结构HVCCHVCC通过HEVCDecoderConfigurationRecord结构存储视频参数集VPS、序列参数集SPS、图像参数集PPS等关键配置信息。该结构最小长度为23字节包含NAL单元数量、大小及类型标识。使用NALU长度固定字节通常为4字节分隔NAL。Annex-B使用start code分隔NAL(start code为三字节或四字节0x000001或0x00000001一般是四字节)SPS和PPS按流的方式写在头部。HEVCDecoderConfigurationRecord结构如下// The CodecPrivate syntax shall follow the// syntax of HEVCDecoderConfigurationRecord// defined in ISO/IEC 14496-15.//// The number zero (0) shall be written to// the configurationVersion variable until// official finalization of 14496-15, 3rd ed.//// After its finalization, this field and the// following CodecPrivate structure shall// follow the definition of the// HEVCDecoderConfigurationRecord in 14496-15.unsignedint(8)configurationVersion;// 版本标识符固定为 0x01)unsignedint(2)general_profile_space;// 配置文件空间标识0-3如 0通用1广播等unsignedint(1)general_tier_flag;// 层级标识0 或 1)unsignedint(5)general_profile_idc;// 配置文件 ID如 Main1, Main 102, Main Still3unsignedint(32)general_profile_compatibility_flags;// 兼容性标识32bit 掩码unsignedint(48)general_constraint_indicator_flags;// 约束指示器用于进一步指定编码配置的特定约束unsignedint(8)general_level_idc;// 编码级别如 3.00x60, 4.00x90最大分辨率、帧率等bit(4)reserved‘1111’b;unsignedint(12)min_spatial_segmentation_idc;// 最小空间分段级别0-4095bit(6)reserved‘111111’b;unsignedint(2)parallelismType;// 并行类型0-20无并行1波前并行2分片并行bit(6)reserved‘111111’b;unsignedint(2)chromaFormat;// 色度格式0单色14:2:024:2:234:4:4bit(5)reserved‘11111’b;unsignedint(3)bitDepthLumaMinus8;// 亮度位深减 80-4bit(5)reserved‘11111’b;unsignedint(3)bitDepthChromaMinus8;// 色度位深减 80-4bit(16)avgFrameRate;// 平均帧率 0 表示动态帧率非零值表示固定帧率如 300x1Ebit(2)constantFrameRate;// 恒定帧率标识0-3bit(3)numTemporalLayers;// 时间分层数1-7bit(1)temporalIdNested;// 时间分层嵌套标识0 或 1unsignedint(2)lengthSizeMinusOne;// 单元长度字段字节数减 1通常为 3表示 4 字节长度字段unsignedint(8)numOfArrays;// 参数集数组数量通常为 3对应 VPS/SPS/PPSfor(j0;jnumOfArrays;j){bit(1)array_completeness;unsignedint(1)reserved0;unsignedint(6)NAL_unit_type;// NAL类型标识unsignedint(16)numNalus;// NAL数量for(i0;inumNalus;i){unsignedint(16)nalUnitLength;// NAL长度bit(8*nalUnitLength)nalUnit;// NAL二进制数据}}Annex-B语法如下(Recommendation ITU-T H.265 08/2021)3 实例分析extradata数据解析VPS跳过23Bytes 后第一个字节0x20 -VPS的类型号紧接着两个字节0x00 0x01表示1个VPS再接着两个字节0x00 0x18表示VPS二进制数据长度24Bytes。SPS跳过24Bytes0x21-SPS 参数集的类型号接着两个字节0x00 0x01 表示一个SPS接着两个字节0x00 0x2dSPS长度为45。PPS跳过45个字节接下来的一个字节是x022-PPS的类型号接下来两个字节0x00 0x01表示一个PPS接下来两个字节0x00 0x07表示PPS长度是7。SEI PREFIX跳过7个字节接下来一个字节是0x27-SEI PREFIX类型号接下来两个字节0x00 0x01表示一个SEI PREFIX接下来两个字节是0x09 0x16表示2326个字节的长度。4 extradata 获取一般使用ffmpeg来获取extradata 和extradata长度存在于AVCodecContext对象中intretavformat_open_input(fmtCtx_,filepath_.toStdString().c_str(),nullptr,nullptr);if(ret0){qDebug()avformat_open_input failed;return;}retavformat_find_stream_info(fmtCtx_,nullptr);if(ret0){qDebug()avformat_find_stream_info failed;return;}for(inti0;ifmtCtx_-nb_streams;i){AVStream*streamfmtCtx_-streams[i];if(stream-codecpar-codec_id!AV_CODEC_ID_H265){qDebug()please input h265 file;return;}constAVCodec*decavcodec_find_decoder(stream-codecpar-codec_id);AVCodecContext*codec_ctx;if(!dec){qDebug()Failed to find decoder for stream:i;return;}codec_ctxavcodec_alloc_context3(dec);if(!codec_ctx){qDebug()Failed to allocate the decoder context for stream:i;return;}retavcodec_parameters_to_context(codec_ctx,stream-codecpar);if(ret0){qDebug()Failed to copy decoder parameters to input decoder context for stream:i;return;}if(codec_ctx-codec_typeAVMEDIA_TYPE_VIDEO||codec_ctx-codec_typeAVMEDIA_TYPE_AUDIO){if(codec_ctx-codec_typeAVMEDIA_TYPE_VIDEO){codec_ctx-framerateav_guess_frame_rate(fmtCtx_,stream,NULL);videoCodecCtx_codec_ctx;videoDec_(AVCodec*)dec;videoStreamIndex_i;if(videoCodecCtx_-extradata_size0){for(inti0;ivideoCodecCtx_-extradata_size;i){qDebug()extradata[i]Qt::hexvideoCodecCtx_-extradata[i];}QString exepathQCoreApplication::applicationDirPath()/extradata.bin;qDebug()videoCodecCtx_-extradata_size:videoCodecCtx_-extradata_size, exepath:exepath;FILE*fpfopen(exepath.toStdString().c_str(),w);if(fp){fwrite(videoCodecCtx_-extradata,videoCodecCtx_-extradata_size,1,fp);fclose(fp);}ui-textEdit_save-setText(exepath);}}elseif(codec_ctx-codec_typeAVMEDIA_TYPE_AUDIO){audioCodecCtx_codec_ctx;audioDec_(AVCodec*)dec;audioStreamIndex_i;}/* Open decoder */retavcodec_open2(codec_ctx,dec,NULL);if(ret0){qDebug()Failed to open decoder for stream:i;return;}}}5 extradata解析C/C代码// 解析HEVCDecoderConfigurationRecord核心字段constuint8_t*ptrextradata;// 版本标识符固定为 0x01) unsigned int(8) configurationVersion;intversionptr[0];// 配置文件空间标识0-3如 0通用1广播等unsigned int(2) general_profile_space;intprofile_space(ptr[1]6)0x03;// 层级标识0 或 1) unsigned int(1) general_tier_flag;inttier_flag(ptr[1]5)0x01;// 配置文件 ID如 Main1, Main 102, Main Still3unsigned int(5) general_profile_idc;intprofile_idcptr[1]0x1F;// 兼容性标识32bit 掩码unsigned int(32) general_profile_compatibility_flags;intprofile_compatibility_flags(ptr[2]24)|(ptr[3]16)|(ptr[4]8)|ptr[5];// 约束指示器用于进一步指定编码配置的特定约束 // unsigned int(48) general_constraint_indicator_flags;uint8_tconstraint_indicator_flags[6];// 6字节约束标志memcpy((void*)constraint_indicator_flags,(void*)ptr[6],6);// 读取约束标志QListQStringstringList;// 使用QList来存储QString对象for(intnum:constraint_indicator_flags){stringList.append(QString::number(num));// 将整数转换为QString并添加到QList中}QString resultstringList.join(, );// 编码级别如 3.00x60, 4.00x90最大分辨率、帧率等 // unsigned int(8) general_level_idc;intlevel_idcptr[12];// 最小空间分段级别0-4095// unsigned int(12) min_spatial_segmentation_idc;uint16_tmin_spatial_seg((ptr[13]8)|ptr[14])0x0FFF;// 并行类型0-20无并行1波前并行2分片并行 // unsigned int(2) parallelismType;intparall_typeptr[15]0x03;// 色度格式0单色14:2:024:2:234:4:4// unsigned int(2) chromaFormat;intchroma_formatptr[16]0x03;// 亮度位深减 80-4// unsigned int(3) bitDepthLumaMinus8;intbit_depth_luma_minus8ptr[17]0x07;// 色度位深减 80-4// unsigned int(3) bitDepthChromaMinus8;intbit_depth_chroma_minus8ptr[18]0x07;// 平均帧率 0 表示动态帧率非零值表示固定帧率如 300x1E// bit(16) avgFrameRate;uint16_tavg_frame_rate(ptr[19]8)|ptr[20];// 恒定帧率标识0-3//bit(2) constantFrameRate;intconstant_frame_rate(ptr[21]6)0x03;// 时间分层数1-7//bit(3) numTemporalLayers;intnum_temporal_layers(ptr[21]3)0x07;// 时间分层嵌套标识0 或 1//bit(1) temporalIdNested;inttemporalIdNested(ptr[21]2)0x01;// 单元长度字段字节数减 1通常为 3表示 4 字节长度字段//unsigned int(2) lengthSizeMinusOne;intlength_size_minus_oneptr[21]0x03;// NAL长度字段字节数// 参数集数组数量通常为 3对应 VPS/SPS/PPS// unsigned int(8) numOfArrays;intnum_arraysptr[22];// 参数集数量,VPS/SPS/PPS(/SEI ...)ptr23;// 偏移到参数集数组起始位置qDebug()num_arrays:num_arrays;QString sets;std::ofstreamout(param_sets.265,std::ios::binary);for(inti0;inum_arrays;i){uint8_tnal_typeptr[0]0x3F;// NAL类型标识intcount(ptr[1]8)|ptr[2];ptr3;for(intj0;jcount;j){uint16_tnal_size(ptr[0]8)|ptr[1];setsgetNameByNalType(nal_type)[QString::number(nal_size) Bytes];if(inum_arrays-1)sets/;ptr2;if(nal_type32||nal_type33||nal_type34){constuint8_tstart_code[]{0x00,0x00,0x00,0x01};out.write(reinterpret_castconstchar*(start_code),4);out.write(reinterpret_castconstchar*(ptr),nal_size);}ptrnal_size;}}6 代码链接Qt5代码实现C 音视频开发问题音视频同步花屏卡顿crashCPU占用过高延时问题解决代码跨平台移植/国产平台适配 / 资源优化等一系列音视频痛点问题

相关新闻

NANDO开源闪存编程器:用STM32 DIY专业级硬件修复工具

NANDO开源闪存编程器:用STM32 DIY专业级硬件修复工具

NANDO开源闪存编程器:用STM32 DIY专业级硬件修复工具 【免费下载链接】nand_programmer NANDO - NAND Open programmer 项目地址: https://gitcode.com/gh_mirrors/na/nand_programmer 想象一下这个场景:你心爱的游戏机突然无法启动,路…

2026/8/4 20:47:17 阅读更多 →
解锁iOS 15-16.6设备激活锁:applera1n工具深度解析与技术指南

解锁iOS 15-16.6设备激活锁:applera1n工具深度解析与技术指南

解锁iOS 15-16.6设备激活锁:applera1n工具深度解析与技术指南 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 面对iOS设备的激活锁困境,许多用户常常束手无策。无论是二手交易中…

2026/8/4 20:47:17 阅读更多 →
macOS升级后鼠标侧键失灵?3个简单步骤让Mac Mouse Fix功能完全恢复

macOS升级后鼠标侧键失灵?3个简单步骤让Mac Mouse Fix功能完全恢复

macOS升级后鼠标侧键失灵?3个简单步骤让Mac Mouse Fix功能完全恢复 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix Mac Mouse Fix是…

2026/8/4 20:47:17 阅读更多 →

最新新闻

道德经道影书斋注释版 056|知者不言

道德经道影书斋注释版 056|知者不言

摘要:本文深度解读《道德经》第五十六章“知者不言,言者不知”的义理。从维性力网拓扑视角剖析“玄同”境界——消融亲疏、利害、贵贱等一切二元对立,回归大道整体。通过老子“知者不言”与杨修“言者不知”的正反案例,阐明真正体…

2026/8/4 21:36:39 阅读更多 →
道德经道影书斋注释版 055|含德之厚

道德经道影书斋注释版 055|含德之厚

摘要:本章以“赤子”为喻,阐释“含德之厚”的生命本态。赤子因无分别心与对抗边界,故能“毒虫不螫,猛兽不据”,其“骨弱筋柔而握固”、“终日号而不嗄”体现了精气内守、阴阳调和的道体。反之,“益生曰祥”…

2026/8/4 21:36:39 阅读更多 →
道德经道影书斋注释版 054|善建不拔

道德经道影书斋注释版 054|善建不拔

全文摘要:本章深度解读《道德经》第五十四章,揭示“善建者不拔,善抱者不脱”的拓扑义理:真正不朽的基业并非外在功名利禄,而是向内扎根于大道本源的德性文脉。通过“修身、齐家、乡、邦、天下”五层由内而外的拓扑扩散…

2026/8/4 21:36:39 阅读更多 →
Architectural Metapatterns中的通信模式:从总线到服务网格的设计策略

Architectural Metapatterns中的通信模式:从总线到服务网格的设计策略

Architectural Metapatterns中的通信模式:从总线到服务网格的设计策略 【免费下载链接】metapatterns Architectural Metapatterns book and wiki 项目地址: https://gitcode.com/gh_mirrors/publications13/metapatterns 在现代软件架构中,通信模…

2026/8/4 21:36:39 阅读更多 →
揭秘浏览器内视频编辑的未来:Omniclip如何重塑内容创作生态

揭秘浏览器内视频编辑的未来:Omniclip如何重塑内容创作生态

揭秘浏览器内视频编辑的未来:Omniclip如何重塑内容创作生态 【免费下载链接】omniclip Open source video editing web application 项目地址: https://gitcode.com/gh_mirrors/om/omniclip 在数字内容创作日益普及的今天,视频编辑工具的选择往往…

2026/8/4 21:36:39 阅读更多 →
Lambda架构实践:大数据批流处理核心技术解析

Lambda架构实践:大数据批流处理核心技术解析

1. Lambda架构在大数据平台中的最佳实践大数据处理领域一直面临着实时性与准确性难以兼得的困境。传统批处理系统能保证数据准确性但延迟高,而纯流式处理虽然响应快却难以处理历史数据。我在金融风控和物联网数据分析项目中多次验证,Lambda架构通过巧妙分…

2026/8/4 21:35:38 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →