VC++ 保存数据为音频文件(WAV)学习
根据到目前我的认识,凡是保存为某种格式的文件的程序,都是用C++做的。下面来学习一下保存为wav文件;
1. 音频简介
经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等.
44100HZ 16bit stereo: 每秒钟有 44100 次采样, 采样数据用 16 位(2字节)记录, 双声道(立体声);
22050HZ 8bit mono: 每秒钟有 22050 次采样, 采样数据用 8 位(1字节)记录, 单声道;
采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。
对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);
而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位(左声道)和低八位(右声道)分别代表两个声道。
人对频率的识别范围是 20HZ - 20000HZ, 如果每秒钟能对声音做 20000 个采样, 回放时就足可以满足人耳的需求. 所以 22050 的采样频率是常用的, 44100已是CD音质, 超过48000的采样对人耳已经没有意义。这和电影的每秒 24 帧图片的道理差不多。
2 wav 文件格式
WAV文件遵循RIFF规则,其内容以区块(chunk)为最小单位进行存储。
WAV文件一般由3个区块组成:RIFF chunk、Format chunk和Data chunk。另外,文件中还可能包含一些可选的区块,如:Fact chunk、Cue points chunk、Playlist chunk、Associated data list chunk等。
3 VC++保存数据为音频文件
首先要定义波形数据格式,
typedef struct{WORD wFormatTag;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
WORD cbSize; } WAVEFORMATEX;
wFormatTag:波形数据的格式,定义在MMREG.H文件中
nChannels:波形数据的通道数:单声道或立体声
nSamplesPerSec:采样率,对于PCM格式的波形数据,采样率有8.0 kHz,11.025kHz,22.05 kHz,44.1 kHz等
nAvgBytesPerSec:数据率,对于PCM格式的波形数据,数据率等于采样率乘以每样点字节数
nBlockAlign:每个样点字节数
wBitsPerSample:采样精度,对于PCM格式的波形数据,采样精度为8或16
cbSize:附加格式信息的数据块大小
然后要定义设备头结构
WAVEHDR定义了指向波形数据缓冲区的设备头。
typedef struct { LPSTR lpData;
DWORD dwBufferLength;
DWORD dwBytesRecorded;
DWORD dwUser;
DWORD dwFlags;
DWORD dwLoops;
struct wavehdr_tag * lpNext;
DWORD reserved; } WAVEHDR;
lpData:波形数据的缓冲区地址
dwBufferLength:波形数据的缓冲区地址的长度
dwBytesRecorded:当设备用于录音时,标志已经录入的数据长度
dwUser:用户数据
dwFlags:波形数据的缓冲区的属性
dwLoops:播放循环的次数,仅用于播放控制中
lpNext和reserved均为保留值
定义这些结构体是为了保存数据用的;
基本保存代码如下;
CFile m_file;
CFileException fileException;
CString m_csFileName= "F:\\audio.wav";//保存路径
m_file.Open(m_csFileName,CFile::modeCreate|CFile::modeReadWrite, &fileException);
DWORD m_WaveHeaderSize = 38;
DWORD m_WaveFormatSize = 18;
m_file.SeekToBegin();
m_file.Write("RIFF",4);
unsigned int Sec=(sizeof pSaveBuffer + m_WaveHeaderSize);
m_file.Write(&Sec,sizeof(Sec));
m_file.Write("WAVE",4);
m_file.Write("fmt ",4);
m_file.Write(&m_WaveFormatSize,sizeof(m_WaveFormatSize));
m_file.Write(&waveform.wFormatTag,sizeof(waveform.wFormatTag));
m_file.Write(&waveform.nChannels,sizeof(waveform.nChannels));
m_file.Write(&waveform.nSamplesPerSec,sizeof(waveform.nSamplesPerSec));
m_file.Write(&waveform.nAvgBytesPerSec,sizeof(waveform.nAvgBytesPerSec));
m_file.Write(&waveform.nBlockAlign,sizeof(waveform.nBlockAlign));
m_file.Write(&waveform.wBitsPerSample,sizeof(waveform.wBitsPerSample));
m_file.Write(&waveform.cbSize,sizeof(waveform.cbSize));
m_file.Write("data",4);
m_file.Write(&dwDataLength,sizeof(dwDataLength));
m_file.Write(pSaveBuffer,dwDataLength);
m_file.Seek(dwDataLength,CFile::begin);
m_file.Close();
VC++ 保存数据为音频文件(WAV)学习相关推荐
- 多种音频文件(.wav, .mp3, .ogg)转化为wav文件,支持分、秒级别切分
多种音频文件(.wav, .mp3, .ogg)转化为wav文件,支持分.秒级别切分 需求:调用python脚本,输入源文件路径.目标路径.切割的时长.切割时长的时间单位,能够将对应路径的源音频文件按 ...
- python保存数据到本地文件_python保存数据到本地文件的方法
python保存数据到本地文件的方法 1.保存列表为.txt文件 #1/list写入txt ipTable = ['158.59.194.213', '18.9.14.13', '58.59.14.2 ...
- python 保存本地乱码,解决python保存数据到csv文件中文乱码的方法
解决python保存数据到csv文件中文乱码的方法 发布时间:2020-07-08 13:49:53 来源:亿速云 阅读:695 作者:清晨 小编给大家分享一下解决python保存数据到csv文件中文 ...
- python爬虫——保存数据为.csv文件
CSV(Comma Separated Values)格式是电子表格和数据库中最常见的输入.输出文件格式 爬虫保存数据为.csv文件步骤: 1.导包 import csv 2.创建或打开文件,设置文件 ...
- mp3在计算机中储存的形式,电脑中保存的AC3音频文件怎么转MP3格式的
原标题:电脑中保存的AC3音频文件怎么转MP3格式的 大家好,我是一名音乐发烧友,也是一名音乐创作 人,平时会经常接触各种各样的音频格式.在网上最常见的音频格式是MP3,相信很多人都知道这一格式,以前 ...
- pcm 采样率转换_PCM编码与Waveform音频文件(.wav)格式详解
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...
- 痞子衡嵌入式:PCM编码与Waveform音频文件(.wav)格式详解
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...
- PCM音频文件(.wav)压缩成ADPCM(.wav)
PCM音频文件压缩成adpcm格式的文件有多中方法(如使用ms ACM.sox等),本文主要介绍使用公开的算法(如下所示,如果需要可到网上搜一下: ========================== ...
- PCM音频文件(.wav)压缩成ADPCM(.wav) ,wav文件分析,wav 文件格式
本文来自: http://blog.csdn.net/jtlyr/article/details/5321884 这里还有介绍一些wav文件的其他网站,记录下: https://ccrma.stanf ...
最新文章
- 未能找到路径的一部分_车辆路径规划三种MIP模型
- LiveVideoStackCon 2020北京站-售票通道关闭倒计时1天
- Ollydbg使用教程学习总结(一)
- 深入研究socket编程(3)——使用select函数编写客户端和服务器
- c# opencv 轮廓检测_基于OpenCV的区域分割、轮廓检测和阈值处理
- Java大厂面试题:从 JVM 角度说进程和线程之间的关系
- 空间复杂度和时间复杂度
- 解决android sdk manage打开闪退的解决方法
- 三国志战略版:Daniel_S6魏延虚弱流开荒实录
- 计组实验-CPU设计-指令添加
- hive 常用函数操作
- KubeCon上海“行业客户云原生最佳实践日“成功举办,云原生在各行业落地生花...
- 小程序uv访客怎么刷_微信小程序获取访客数据-使用攻略
- 核定征收的个体户,年营业额不超过120万,还需要缴纳个税吗?
- Len()、Lenw()与Lenb()函数间的区别
- uni-app中文本过长-实现折叠与展开效果
- breakpoint
- QQ音乐 vs 网易云音乐,用户体验哪家强?
- 官宣 | BoCloud博云 x 紫光云引擎达成战略合作
- usb3.0 u盘 安装 linux,在16G USB3.0中安装ubuntu10.10成功!U盘功能可用
热门文章
- package.json文件||项目依赖||开发依赖
- SpringMVC入门案例细节分析
- 标签页使用及bug解决
- javascript (function(){})()
- 各种主流数据库的比较
- Python 技术篇-requests发送post请求传文件给flask服务端报405、400问题解决方法
- CTFshow 命令执行 web72
- CTFshow 信息收集 web12
- 【plt显示Tensor转出来的array时的报错】TypeError: Invalid dimensions for image data
- 【Kaggle-MNIST之路】两层的神经网络Pytorch(改进版)(二)