讲师中心 微信公众号
AI工具推荐 视频效率加速

c++如何读取波形文件WAV格式_音频头信息解析【进阶】

风杰酱_1106

风杰酱_1106

发布时间:2026-04-11 21:12:15

|

374人浏览过

|

来源于php中文网

原创

WAV文件头必须按小端序解析整数字段,否则ChunkSize等值错误;应使用uint8_t逐字节读取并手动组合,避免直接用int32_t或fread结构体导致字节序和内存对齐问题。

c++如何读取波形文件wav格式_音频头信息解析【进阶】

WAV文件头结构怎么解析才不会读错字节顺序

WAV是RIFF格式的子集,头部包含嵌套的RIFF、fmt 和data块,**必须按小端序(little-endian)读取整数字段**,否则ChunkSize、Subchunk2Size等会解析成错误值。常见错误是直接用int32_t读取但忽略平台字节序,或用fread一次性读结构体却未处理内存对齐与填充。

实操建议:

  • 用uint8_t逐字节读,再手动组合:比如读4字节Subchunk1Size,应为buf[0] | (buf[1]
  • 不要#pragma pack(1)后直接fread进struct——Windows SDK头定义的WAVEFORMATEX含可变长字段,且不同wFormatTag对应不同扩展字段长度
  • 先读RIFF头8字节确认标识符是"RIFF" + "WAVE",再跳过ChunkSize(该值不包含前8字节),定位到fmt 块

如何安全提取fmt子块并识别PCM/非PCM编码

fmt 块起始位置不固定:它前面可能有LIST、INFO等可选块,不能假设它一定在第12字节。必须循环解析每个子块,直到遇到"fmt "(注意末尾空格)。

关键字段判断逻辑:

立即学习“C++免费学习笔记(深入)”;

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • wFormatTag为1表示PCM;3是IEEE Float;0xFFFE是WAVE_FORMAT_EXTENSIBLE,此时需继续读后续的cbSize(通常22字节)并检查SubFormat GUID
  • nChannels和nSamplesPerSec可直接用;但nAvgBytesPerSec仅作参考,真实每秒字节数由nChannels * nBitsPerSample * nSamplesPerSec / 8算出
  • 若wBitsPerSample为24,且格式是PCM,则数据块中每个样本占3字节(无符号小端),不是自动补到4字节

读取data块时怎么跳过非音频内容并校验长度

data块不一定紧跟fmt 块:中间可能插入fact、cue 、plst等块。必须按RIFF规范遍历子块,用fseek跳过未知类型块(依据其SubchunkSize字段)。

容易踩的坑:

  • Subchunk2Size是data块内**原始采样字节数**,不是文件剩余长度;若该值大于实际文件大小,说明文件损坏,应截断处理
  • 某些录音软件写入的WAV含ID3v2标签(放在LIST块里),会被误认为data块起点——务必校验块ID是否为严格"data"(4字节)
  • 若wFormatTag == 0xFFFE(扩展格式),data块数据前可能有额外的1字节对齐填充(取决于SamplesPerBlock),需结合dwChannelMask和SubFormat判断

用C++标准流读WAV头有哪些隐蔽陷阱

std::ifstream默认以文本模式打开,Windows下会把\r\n转成\n,导致后续所有偏移错乱。必须显式用std::ios::binary标志。

性能与安全建议:

  • 不要用operator>>读整数——它依赖locale且不保证字节序;坚持用read() + 手动解包
  • 用gcount()检查每次read()是否读满预期字节数,避免EOF提前导致字段截断
  • 对ChunkID这类字符串字段,用char[4]读取后加\0再用std::string_view比较,别用strcmp(可能越界)

复杂点在于:WAV没有强制要求data块必须是最后一个块,也不禁止重复块ID;实际解析器得做好容错,比如跳过无法识别的块、记录已见块类型、对冲突字段(如多个fmt )取第一个。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

4734

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

4891

2025.07.04

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

Playwright 页面操作指南
Playwright 页面操作指南

Playwright页面操作专题汇集元素定位、点击与输入、等待响应、多页面切换、Iframe、事件监听及文件处理的已审核文章,便于按操作场景查阅示例与常见问题。

0

2026.10.21

Playwright 入门教程
Playwright 入门教程

Playwright入门专题汇集测试框架安装、VS Code配置、录制脚本、编写首个用例、运行调试及查看报告的已审核文章,帮助初学者搭建端到端测试流程。

0

2026.10.21

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

100

2026.10.16

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

80

2026.10.16

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

40

2026.10.16

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

40

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn