h264 extradata解析,提取参数集SPS/PPS
1 背景在音视频处理中AVCC 格式转换为 Annex-B 格式的典型场景包括以下六种情况一、Android/Harmony等平台硬件解码场景Android/Harmony 系统硬解码器通常仅支持 Annex-B 格式的码流输入。当从 MP4/MKV/MOV等容器默认使用 AVCC 格式中提取 H.264码流进行解码时需通过 SPS/PPS 提取、起始码替换等操作完成格式转换。例如 MP4 文件头部的 AVCDecoderConfigurationRecord 数据结构需被解析后重组为 Annex-B 的头部结构。二、实时流传输协议封装在 RTP/RTSP 协议传输或 TS 流封装场景中Annex-B 格式作为标准要求存在。由于 Annex-B 使用 0x000001 或 0x00000001 起始码标识 NALU 边界便于流媒体服务端进行码流分割和实时传输。三、容器格式转换场景将 MP4 文件重新封装为 FLV、TS 等格式时需遵循目标容器的编码规范。例如 FLV 容器要求视频编码信息通过 AVCDecoderConfigurationRecord 传递而 TS 流通常直接使用 Annex-B 格式的起始码分割 NALU。四、硬件解码兼容性修复某些硬件解码器如部分 GPU 加速方案对 Annex-B 格式有强依赖性。若使用 FFmpeg 的 h264_mp4toannexb 等 Bitstream Filter 处理码流时未正确处理 SPS/PPS 插入逻辑可能引发硬解异常此时需规范转换流程。五、防竞争字节处理需求AVCC 格式使用长度前缀标识 NALU 大小而 Annex-B 需在码流中插入防竞争字节Emulation Prevention Bytes避免起始码冲突。当需要兼容老式解码设备或特定流媒体服务器时必须进行格式转换以实现防竞争处理。六、低延迟直播场景优化Annex-B 格式允许在关键帧前周期性插入 SPS/PPS使解码器可从视频流任意位置开始解码。这种特性使其更适合低延迟直播场景而 AVCC 格式因依赖容器头部的集中式参数存储难以满足实时流随机接入需求。AVCC转 Annex-B 场景中当视频帧是IDR帧时需要将参数集SPS/PPS在IDR前拷贝到解码器输入缓存中才能正常解码。本文讲解H.264 extradata语法以及如何从mp4/mkv/mov等容器中提取参数集SPS/PPS。2 AVCC和Annex-B的定义和区别AVCCAVCC是一种用于封装H.264码流的格式它将SPSSequence Parameter Set和PPSPicture Parameter Set封装为ExtraData通常用于MP4/MKV/MOV等封装格式的文件头中播放器通过这些信息初始化解码器‌。Annex-B‌这是一种对NALU层进行包装的格式每个NALU前面加上起始码如0x000001或0x00000001用于分隔不同的NALU。为了防止原始码流中出现相同的起始码Annex-B引入了防竞争字节Emulation Prevention Bytes的概念即在出现0x0001之前插入一个字节内容为0x3‌。 AVCC以长度信息替代起始码其NALU内部的原始数据无需额外处理即可避免数据与起始码冲突的问题因此没有防竞争码。AVCC 结构AVCC封装的H.264码流中最前面的是AVCDecoderConfigurationRecord或称为extradata。AVCDecoderConfigurationRecord语法如下所示(H.264-AVC-ISO_IEC_14496-15)字段解释 configurationVersion 占1字节版本号固定为1。 AVCProfileIndication 占1字节SPS的profile_idc即(H.264标准规定的)SPS的第一个字节。 profile_compatibility占1字节即(H.264标准规定的)SPS的第二个字节。 AVCLevelIndication 占1字节SPS的level_idc即(H.264标准规定的)SPS的第三个字节。 lengthSizeMinusOne取该字节低2位lengthSizeMinusOne为存贮NALUnitLength所需的空间减1 单位为字节。比如当lengthSizeMinusOne为2那么存贮该路H.264码流的每个NALUnitLength所需 的空间为(21)个字节。我们在读取每个NALU之前先读(21)个字节把读取到的数据转成整数 这就是该NALU的总长度了。 numOfSequenceParameterSets取该字节低5位该extradata中SPS个数。 sequenceParameterSetLength占2字节SPS长度以字节为单位。 sequenceParameterSetNALUnitSPS二进制数据长度为sequenceParameterSetLength字节。 numOfPictureParameterSets占1字节该extradata中PPS个数。 pictureParameterSetLength占2字节PPS长度以字节为单位。 pictureParameterSetNALUnitPPS二进制数据长度为pictureParameterSetLength字节。 chroma_format取低2位包含由chroma_format_idc参数定义的chroma_format指示符。 bit_depth_luma_minus8取低3位表示Luma数组中样本的位深度。例如位深度为8用0 表示 位深度8bit_depth_luma_minus8。此字段的值应在0到4的范围内包括0和4。 bit_depth_chroma_minus8取低3位表示Chroma阵列中样本的位深度。例如位深度为8用0 表示 位深度8bit_depth_luma_minus8。此字段的值应在0到4的范围内包括0和4。 numOfSequenceParameterSetExt占1字节表示用于解码AVC基本流的序列参数集扩展的数量。 sequenceParameterSetExtLength占2字节表示SPS 扩展的长度。 sequenceParameterSetExtNALUnit表示SPS 扩展二进制数据长度为sequenceParameterSetExtLength字节。AVCProfileIndicationprofile_compatibilityAVCLevelIndication三个字段对应H.264标准(44 Rec. ITU-T H.264 (08/2021))定义的前三个字节如下图所示。Annex-B‌ 结构(Recommendation ITU-T H.264 08/2021)3 实例分析01 :configurationVersion固定为164:AVCProfileIndication 1字节00:profile_compatibility1字节28:AVCLevelIndication1字节ff:低2位是 “11”,即3 说明存储 “NALUnitLength”所需空间是31 即4.e1:numOfSequenceParameterSets取低5位“00001” ,即100 1e:这两个字节是 numOfSequenceParameterSets的长度二进制“11110”, 十进制30SPS nal 长30个字节跳过sps nal 30个字节。01pps个数 100 06:pps二进制数据长度6个字节跳过6个字节fd:chroma_format,取低2位为0f8:bit_depth_luma_minus8取低三位0f8:bit_depth_chroma_minus8取低三位04 获取avc extradatah264, extra data存在于trak-mdia-minf-stbl-stsd-avc1-avcc 通常使用ffmpeg解封装后得到。// 解析文件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_H264){qDebug()please input h264 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){QString exepathQCoreApplication::applicationDirPath()/extradata.bin;FILE*fpfopen(exepath.toStdString().c_str(),w);if(fp){fwrite(videoCodecCtx_-extradata,videoCodecCtx_-extradata_size,1,fp);fclose(fp);}}}elseif(codec_ctx-codec_typeAVMEDIA_TYPE_AUDIO){audioCodecCtx_codec_ctx;audioDec_(AVCodec*)dec;audioStreamIndex_i;}retavcodec_open2(codec_ctx,dec,NULL);if(ret0){qDebug()Failed to open decoder for stream:i;return;}}}5 解析avc extradatavoidMainWindow::parseAvcExtradata(constuint8_t*extra_data){intpos1;// AVCProfileIndication1字节intavcprofileidcextra_data[pos];// profile_compatibility1字节intavcprofilecompatextra_data[pos];// AVCLevelIndication1字节intavclevelidcextra_data[pos];// lengthSizeMinusOne低2位intlensizeextra_data[pos]0x03;// numOfSequenceParameterSets低5位intnumSPSextra_data[pos]0x1F;// aways 1std::vectoruint8_tsps;for(inti0;inumSPS;i){// sequenceParameterSetLength2字节intspsLen(extra_data[pos]8)|extra_data[pos1];pos2;sps.assign(extra_datapos,extra_dataposspsLen);posspsLen;}std::vectoruint8_tpps;// numOfPictureParameterSets低5位intnumPPSextra_data[pos];for(inti0;inumPPS;i){// pictureParameterSetLength2字节intppsLen(extra_data[pos]8)|extra_data[pos1];pos2;pps.assign(extra_datapos,extra_dataposppsLen);posppsLen;}// chroma_format, 取低2位intchroma_formatextra_data[pos]0x03;// bit_depth_luma_minus8, 取低3位intbit_depth_luma_minus8(extra_data[pos]0x07);// bit_depth_chroma_minus8, 取低3位intbit_depth_chroma_minus8(extra_data[pos]0x07);// numOfSequenceParameterSetExt,占1字节intspsextnumextra_data[pos];std::vectoruint8_tspsext;for(inti0;ispsextnum;i){// sequenceParameterSetExtLength,2字节intspsextLen(extra_data[pos]8)|extra_data[pos1];pos2;spsext.assign(extra_datapos,extra_dataposspsextLen);posspsextLen;}}6 代码连接avc extradata提取和解析代码运行界面如下C 音视频开发问题音视频同步花屏卡顿crashCPU占用过高延时问题解决代码跨平台移植/国产平台适配 / 资源优化等一系列音视频痛点问题

相关新闻

React Native笔记

React Native笔记

React Native(RN)采用JavaScript编写应用逻辑,利用React框架构建UI。在运行时,RN通过桥接机制将JavaScript代码与原生平台代码进行通信。对于iOS和Android,RN分别有对应的原生渲染引擎。在iOS上,它利用iOS的…

2026/8/4 20:49:19 阅读更多 →
AI字体匹配失效真相(2024字体神经网络训练数据泄露报告)

AI字体匹配失效真相(2024字体神经网络训练数据泄露报告)

更多请点击: https://intelliparadigm.com 第一章:AI字体匹配失效真相(2024字体神经网络训练数据泄露报告) 2024年3月,安全研究团队在审计某主流设计平台的字体推荐API时发现:其底层AI模型在跨字体语义匹配…

2026/8/4 20:49:19 阅读更多 →
2026亚马逊多店铺运营的环境隔离架构与合规实践

2026亚马逊多店铺运营的环境隔离架构与合规实践

做亚马逊多店铺的朋友,先别急着问"用哪款工具更稳"。我在这个行业里做指纹浏览器底层研发,也带团队把产品卖到海外几十个国家,见过太多卖家拿着一套"通用方案"冲进来,以为配个工具就能高枕无忧,结…

2026/8/4 20:49:19 阅读更多 →

最新新闻

终极跨平台Unity资源编辑器:UABEAvalonia深度解析与实战指南

终极跨平台Unity资源编辑器:UABEAvalonia深度解析与实战指南

终极跨平台Unity资源编辑器:UABEAvalonia深度解析与实战指南 【免费下载链接】UABEA c# uabe for newer versions of unity 项目地址: https://gitcode.com/gh_mirrors/ua/UABEA 你是否曾面对Unity游戏资源束手无策?UABEAvalonia作为新一代跨平台…

2026/8/4 21:31:37 阅读更多 →
全平台资源下载终极指南:3步轻松获取微信视频号、抖音、小红书等热门内容

全平台资源下载终极指南:3步轻松获取微信视频号、抖音、小红书等热门内容

全平台资源下载终极指南:3步轻松获取微信视频号、抖音、小红书等热门内容 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-download…

2026/8/4 21:31:36 阅读更多 →
Bedrock Linux Userland:打造终极Linux发行版融合平台的完整指南

Bedrock Linux Userland:打造终极Linux发行版融合平台的完整指南

Bedrock Linux Userland:打造终极Linux发行版融合平台的完整指南 【免费下载链接】bedrocklinux-userland This tracks development for the things such as scripts and (defaults for) config files for Bedrock Linux 项目地址: https://gitcode.com/gh_mirror…

2026/8/4 21:31:36 阅读更多 →
Retro ESP32高级技巧:3种画面缩放模式与游戏收藏功能

Retro ESP32高级技巧:3种画面缩放模式与游戏收藏功能

Retro ESP32高级技巧:3种画面缩放模式与游戏收藏功能 【免费下载链接】RetroESP32 Retro ESP32 is a turbo charged Odroid Go Launcher, Emulator and ROM Manager 项目地址: https://gitcode.com/gh_mirrors/re/RetroESP32 Retro ESP32是一款功能强大的Odr…

2026/8/4 21:31:36 阅读更多 →
手把手写一个企业订阅包选型计算器

手把手写一个企业订阅包选型计算器

前言采购企业订阅包(资源包)时,销售给的通常是一句"单价打七折"。但折扣不等于省钱——包有有效期,用不完的额度就是沉没成本。真正该问的是:必须用掉几成才不亏?本文带你写一个命令行计算器&…

2026/8/4 21:31:36 阅读更多 →
3大核心功能+5步实战:Diva Mod Manager初音未来模组管理终极指南

3大核心功能+5步实战:Diva Mod Manager初音未来模组管理终极指南

3大核心功能5步实战:Diva Mod Manager初音未来模组管理终极指南 【免费下载链接】DivaModManager 项目地址: https://gitcode.com/gh_mirrors/di/DivaModManager Diva Mod Manager是专为《初音未来:歌姬计划 Mega Mix》打造的图形化模组管理工具…

2026/8/4 21:30:36 阅读更多 →

日新闻

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 阅读更多 →