讲师中心 微信公众号

工具推荐

视频效率加速
立刻MV
立刻MV

低成本歌曲 MV、视频生成

剧云
剧云

中文短剧剧本制作平台

Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

c++如何读取并提取WAV文件中的PCM原始采样数据【实战】

轻墨君_6881

轻墨君_6881

发布时间:2026-04-06 22:12:03

|

712人浏览过

|

来源于php中文网

原创

正确解析WAV文件头需逐块遍历,读取子块ID与size,定位"data"块起始位置;PCM数据为小端有符号整数,16位直接转int16_t,24位需符号扩展至int32_t,32位直接映射int32_t。

c++如何读取并提取wav文件中的pcm原始采样数据【实战】

WAV文件头怎么解析才能拿到PCM数据起始位置

WAV不是纯PCM,它带RIFF头和fmt子块,必须跳过这些元数据才能读到真正的采样字节。直接fseek(fp, 44, SEEK_SET)是常见误区——44字节只适用于标准16位单/双声道、44.1kHz的WAV,一旦有额外的LIST块、fact块或扩展fmt(如WAVE_FORMAT_EXTENSIBLE),实际数据偏移会变。

正确做法是逐块解析:先读4字节确认是"RIFF",再跳过8字节,然后循环读取每个子块的ID(4字节)和size(4字节)。遇到"data"块时,它的size字段就是后续PCM数据的字节数,而当前文件指针位置就是PCM起始地址。

  • 用fread(&chunk_id, 1, 4, fp)读块ID,注意字节序是小端,但ASCII字符不受影响
  • fmt子块必须至少24字节(WAVE_FMT_CHUNK_SIZE),若wFormatTag为WAVE_FORMAT_EXTENSIBLE(0xFFFE),则实际fmt长度为40字节,需多读16字节扩展区
  • 别依赖sizeof(WAVEFORMATEX),Windows SDK里这个结构体有可变数组,编译器填充可能不同

如何把PCM字节转成有符号整数数组(int16_t / int32_t)

WAV的PCM数据按样本(sample)连续排列,每个样本的字节数由wBitsPerSample决定:16位对应int16_t,24位需补高位转int32_t,32位直接映射int32_t。关键点在于字节序和符号扩展。

所有WAV PCM数据都是小端序,且有符号:16位PCM是二进制补码的int16_t;24位PCM通常存为3字节小端(低字节在前),读入后要手动符号扩展到32位;32位PCM就是原生int32_t小端。

C++14
C++14

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

下载

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

  • 24位处理示例:int32_t sample = (data[i] | (data[i+1]
  • 别用memcpy直接往int16_t*强转——如果原始字节流地址未对齐(比如从奇数offset开始读),在ARM等平台会触发SIGBUS
  • 声道交错(interleaved)是默认布局:LRLRLR…,提取单声道需步进channels个样本,例如双声道中左声道索引为i * channels + 0

用C++标准库读WAV比手写fread更安全吗

不推荐用std::ifstream配合read()替代fread(),除非你明确需要RAII或locale无关性。问题在于std::ifstream默认是文本模式(尤其Windows下会把\r\n转\n),而WAV二进制数据里完全可能出现0x0D 0x0A字节序列,导致数据错位。

  • 必须加std::ios::binary标志:std::ifstream file("a.wav", std::ios::binary);
  • file.read()不保证一次读完指定字节数,需检查gcount()返回值,否则缓冲区残留脏数据
  • 对于大文件(>2GB),std::ifstream::seekg()在32位off_type下会截断,fseek()配fpos_t或C++17的seekg(pos, std::ios::beg)更稳

为什么读出来的PCM数据播放杂音或静音

杂音大概率是数据类型/字节序/声道顺序没对齐;静音则常因采样率或位深误判导致播放器解码失败。WAV头里的dwSamplesPerSec和wBitsPerSample必须和实际数据严格一致,播放器不会校验——它只按头里写的参数去解释字节流。

  • 用ffprobe -v quiet -show_entries stream=sample_rate,bits_per_sample,channels a.wav交叉验证头信息是否真实
  • 导出PCM裸数据调试时,用xxd -c 16 -g 2 a.pcm | head看前几组16进制,确认是否呈现典型正弦波交替模式(如0x0000, 0x1000, 0x0000, 0xF000…)
  • 某些录音软件生成的WAV用IEEE float(32位float)格式,此时wFormatTag是WAVE_FORMAT_IEEE_FLOAT(3),不能当整数解析

实际处理时最易被忽略的是fmt块长度变异和24位数据的手动符号扩展——这两个点不踩坑,剩下的就是按字节搬数据了。

相关文章

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

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

下载

相关标签:

c++

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

热门AI工具

更多
立刻MV
立刻MV Hot

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

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

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

豆包大模型

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

SoundView
SoundView Hot

SoundView是一款面向跨境电商的视频翻译、配音和本地化 AI 创作平台。

火山引擎

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

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

DeepSeek

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

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

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

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

5434

2025.06.09

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

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

5611

2025.07.04

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

399

2026.04.23

常见的编码方式
常见的编码方式

常见的编码方式有ASCII编码、Unicode编码、UTF-8编码、UTF-16编码、GBK编码等。想了解更多编码方式相关内容,可以阅读本专题下面的文章。

1548

2023.10.24

a和A对应的ASCII码数值
a和A对应的ASCII码数值

a的ascii码是65,a的ascii码是97;ascii码表中,一个字母的大小写数值相差32,一般知道大写字母的ascii码数值,其对应的小写字母的ascii码数值就算出来了,是大写字母的ascii码数值“+32”。想了解更多相关的内容,可阅读本专题下面的相关文章。

5727

2024.10.24

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3479

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3038

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1548

2023.08.01

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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