根据到目前我的认识,凡是保存为某种格式的文件的程序,都是用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)学习相关推荐

  1. 多种音频文件(.wav, .mp3, .ogg)转化为wav文件,支持分、秒级别切分

    多种音频文件(.wav, .mp3, .ogg)转化为wav文件,支持分.秒级别切分 需求:调用python脚本,输入源文件路径.目标路径.切割的时长.切割时长的时间单位,能够将对应路径的源音频文件按 ...

  2. python保存数据到本地文件_python保存数据到本地文件的方法

    python保存数据到本地文件的方法 1.保存列表为.txt文件 #1/list写入txt ipTable = ['158.59.194.213', '18.9.14.13', '58.59.14.2 ...

  3. python 保存本地乱码,解决python保存数据到csv文件中文乱码的方法

    解决python保存数据到csv文件中文乱码的方法 发布时间:2020-07-08 13:49:53 来源:亿速云 阅读:695 作者:清晨 小编给大家分享一下解决python保存数据到csv文件中文 ...

  4. python爬虫——保存数据为.csv文件

    CSV(Comma Separated Values)格式是电子表格和数据库中最常见的输入.输出文件格式 爬虫保存数据为.csv文件步骤: 1.导包 import csv 2.创建或打开文件,设置文件 ...

  5. mp3在计算机中储存的形式,电脑中保存的AC3音频文件怎么转MP3格式的

    原标题:电脑中保存的AC3音频文件怎么转MP3格式的 大家好,我是一名音乐发烧友,也是一名音乐创作 人,平时会经常接触各种各样的音频格式.在网上最常见的音频格式是MP3,相信很多人都知道这一格式,以前 ...

  6. pcm 采样率转换_PCM编码与Waveform音频文件(.wav)格式详解

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...

  7. 痞子衡嵌入式:PCM编码与Waveform音频文件(.wav)格式详解

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...

  8. PCM音频文件(.wav)压缩成ADPCM(.wav)

    PCM音频文件压缩成adpcm格式的文件有多中方法(如使用ms ACM.sox等),本文主要介绍使用公开的算法(如下所示,如果需要可到网上搜一下: ========================== ...

  9. PCM音频文件(.wav)压缩成ADPCM(.wav) ,wav文件分析,wav 文件格式

    本文来自: http://blog.csdn.net/jtlyr/article/details/5321884 这里还有介绍一些wav文件的其他网站,记录下: https://ccrma.stanf ...

最新文章

  1. 未能找到路径的一部分_车辆路径规划三种MIP模型
  2. LiveVideoStackCon 2020北京站-售票通道关闭倒计时1天
  3. Ollydbg使用教程学习总结(一)
  4. 深入研究socket编程(3)——使用select函数编写客户端和服务器
  5. c# opencv 轮廓检测_基于OpenCV的区域分割、轮廓检测和阈值处理
  6. Java大厂面试题:从 JVM 角度说进程和线程之间的关系
  7. 空间复杂度和时间复杂度
  8. 解决android sdk manage打开闪退的解决方法
  9. 三国志战略版:Daniel_S6魏延虚弱流开荒实录
  10. 计组实验-CPU设计-指令添加
  11. hive 常用函数操作
  12. KubeCon上海“行业客户云原生最佳实践日“成功举办,云原生在各行业落地生花...
  13. 小程序uv访客怎么刷_微信小程序获取访客数据-使用攻略
  14. 核定征收的个体户,年营业额不超过120万,还需要缴纳个税吗?
  15. Len()、Lenw()与Lenb()函数间的区别
  16. uni-app中文本过长-实现折叠与展开效果
  17. breakpoint
  18. QQ音乐 vs 网易云音乐,用户体验哪家强?
  19. 官宣 | BoCloud博云 x 紫光云引擎达成战略合作
  20. usb3.0 u盘 安装 linux,在16G USB3.0中安装ubuntu10.10成功!U盘功能可用

热门文章

  1. package.json文件||项目依赖||开发依赖
  2. SpringMVC入门案例细节分析
  3. 标签页使用及bug解决
  4. javascript (function(){})()
  5. 各种主流数据库的比较
  6. Python 技术篇-requests发送post请求传文件给flask服务端报405、400问题解决方法
  7. CTFshow 命令执行 web72
  8. CTFshow 信息收集 web12
  9. 【plt显示Tensor转出来的array时的报错】TypeError: Invalid dimensions for image data
  10. 【Kaggle-MNIST之路】两层的神经网络Pytorch(改进版)(二)