C++生成简单WAV文件(一)

 2023-09-11 阅读 21 评论 0

摘要:有了WAV头文件的格式,要生成一个WAV格式的声音文件就比较简单了,只要将头文件输出,在简单生成一点内容就可以了。为了简单,就生成一个单声道,11025HZ的,长度一秒的声音文件。 那么开做,要生成一个文件,那么文件的输出

有了WAV头文件的格式,要生成一个WAV格式的声音文件就比较简单了,只要将头文件输出,在简单生成一点内容就可以了。为了简单,就生成一个单声道,11025HZ的,长度一秒的声音文件。

那么开做,要生成一个文件,那么文件的输出流<fstream>肯定要用到,参考了一下资料,简单整了如下的一个程序:

#include <iostream>
#include<fstream> //文件输出
#include<math.h> //主要生产波形使用SIN函数,所以弄了这个头using namespace std;
float dou=256; //声音dou的频率264,这里为了凑整数用的256 HZ  struct WavHead{char RIFF[4];    //头部分那个RIFFlong int size0;//存的是后面所有文件大小char WAVE[4];char FMT[4];long int size1;//存的是fmt保存的大小,包含这之后,data前面几个,共16个short int fmttag;short int channel;long int samplespersec;//每秒采样数,用的是11025long int bytepersec;short int blockalign;short int bitpersamples;char DATA[4];long int size2;//剩下文件大小,也就是声音采样是大小,因为是一秒钟的内容,那么就是11025了。

};int main() {WavHead head={{'R','I','F','F'},0,{'W','A','V','E'},{'f','m','t',' '},16,1,1,11025,11025,1,8,{'d','a','t','a'},0};//初始化,没将声音采样文件大小赋值,后面修改head.size0=11025+16+8;head.size2=11025;char body[head.size2];//打算将采样数据放在这个里面int i,i2;//为了声音不是很单调,用了两个循环,里面一层i是生成声音函数,外面那层i2,是生成不同频率的。float a=(head.samplespersec/dou);//是dou持续时间(1/dou)除以采样数(1/head.samplespersec),也就是一个dou的波形里有a个采样点,这里是43。for (i2=1;i2<=2;i2++){//这里弄了两个声音,一个是256HZ,一个是512HZfor(i=0+head.size2/2*(i2-1);i<head.size2/2*i2;i++){body[i]=(int)(64*sin(6.28/a*i*i2)+128);//这个波用的是sina函数,以128(ox80)为中心的正弦波,实际上当采样点是0x80的时候是静音,大于则是正的,小于0X80则是负的,前面64则是声音大小,等于128的时候,生成的声音最大
}}ofstream ocout;ocout.open("123.wav",ios::out|ios::binary);//打开(不存在时生成)123.wav
ocout.write((char*)&head,sizeof head);//将文件头部分写进文件ocout.write((char*)&body,sizeof body);//将数据文件写入程序
ocout.close();//关闭文件cout <<head.samplespersec <<" "<<dou<< endl; // 调试的时候查看一下文件大小是否出错return 0;
}

调试运行成功

转载于:https://www.cnblogs.com/shibuliao/p/3815210.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/46101.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息