第一次写博客,有问题请指正哈。
首先上代码吧:
#include"stdio.h"
#include"math.h"
#include"stdlib.h"
#include"windows.h"
#include "al.h"
#include "alc.h"
#pragma comment(lib,"openal32.lib")
ALuint Source;// 用于播放声音
ALuint Buffer;// 声音数据
bool InitOpenAL()
{
ALCdevice * pDevice = alcOpenDevice(NULL); // 打开默认音频设备
ALCcontext * pContext = alcCreateContext(pDevice, NULL);
alcMakeContextCurrent(pContext);
return true;
// 注意:这里没有进行失败检测,仅用于示例
}
void ShutdownOpenAL()
{
ALCcontext *pContext;
ALCdevice *pDevice;
pContext = alcGetCurrentContext();
pDevice = alcGetContextsDevice(pContext);
alcMakeContextCurrent(NULL);
alcDestroyContext(pContext);
alcCloseDevice(pDevice);
}
bool LoadData()
{
//
FILE*fw;
int shengdao;
int pinlv;
int lianghws;
int xxx = 1;
fw = fopen("1.wav", "rb");
for (;xxx == 1;)
{
if (fgetc(fw) == 'f')
{
if (fgetc(fw) == 'm')
{
if (fgetc(fw) == 't')
{
if (fgetc(fw) == ' ')
{
int ask1, zj[6];
for (ask1 = 0;ask1<6;ask1++)
{
fgetc(fw);
}
zj[0] = fgetc(fw);
zj[1] = fgetc(fw) << 8;
zj[2] = fgetc(fw);
zj[3] = fgetc(fw) << 8;
zj[4] = fgetc(fw) << 16;
zj[5] = fgetc(fw) << 24;
shengdao = zj[0] + zj[1];
pinlv = zj[2] + zj[3] + zj[4] + zj[5];
for (ask1 = 0;ask1<6;ask1++)
{
fgetc(fw);
}
zj[0] = fgetc(fw);
zj[1] = fgetc(fw) << 8;
lianghws = zj[0] + zj[1];
xxx = 0;
}
}
}
}
}
int shujudx;
xxx = 1;
for (;xxx == 1;)
{
if (fgetc(fw) == 'd')
{
if (fgetc(fw) == 'a')
{
if (fgetc(fw) == 't')
{
if (fgetc(fw) == 'a')
{
int zj[4];
zj[0] = fgetc(fw);
zj[1] = fgetc(fw) << 8;
zj[2] = fgetc(fw) << 16;
zj[3] = fgetc(fw) << 24;
shujudx = zj[0] + zj[1] + zj[2] + zj[3];
xxx = 0;
}
}
}
}
}
FILE*fws;
fws = fopen("成品.txt","w");
int daxiao = (shujudx / shengdao) / (lianghws / 8);
short* datas = (short*)malloc(daxiao*2);
for (xxx = 0;xxx<daxiao;xxx++)
{
int zj[4];
zj[0] = fgetc(fw);
zj[1] = fgetc(fw) << 8;
if (shengdao==2)
{
zj[2] = fgetc(fw);
zj[3] = fgetc(fw) << 8;
}
else
{
zj[2] = zj[0];
zj[3] = zj[1];
}
datas[xxx] = (zj[0] + zj[1] + zj[0] + zj[1]) / 2;
fputc(datas[xxx],fws);
}
fclose(fw);
fclose(fws);
解码
// 载入变量.
ALboolean loop = 1; // 循环播放
alGenBuffers(1, &Buffer);
// 载入WAV数据
alBufferData(Buffer, AL_FORMAT_MONO16, datas, shujudx/shengdao, pinlv);
alGenSources(1, &Source);
// 源声音的位置
ALfloat SourcePos[] = { 0.0, 0.0, 0.0 };
// 源声音的速度
ALfloat SourceVel[] = { 0.0, 0.0, 0.0 };
alSourcei(Source, AL_BUFFER, Buffer);
alSourcef(Source, AL_PITCH, 1.0f);
alSourcef(Source, AL_GAIN, 1.0f);
alSourcefv(Source, AL_POSITION, SourcePos);
alSourcefv(Source, AL_VELOCITY, SourceVel);
alSourcei(Source, AL_LOOPING, loop);
return true;
}
void UnloadData()
{
alDeleteBuffers(1, &Buffer);
alDeleteSources(1, &Source);
}
void Play()
{
// 播放
alSourcePlay(Source);
printf("Press Enter To Stop Sound\n");
getchar();
alSourceStop(Source);
}
int main(int argc, char *argv[])
{
InitOpenAL(); // 初始化openal
LoadData(); // 载入WAV数据
for (;;)
{
Play(); // 播放
}
UnloadData(); // 卸载WAV数据
ShutdownOpenAL(); // 关闭openal
return 0;
}
在上面程序中,主要部分是解码部分
FILE*fw;
int shengdao;
int pinlv;
int lianghws;
int xxx = 1;
fw = fopen("1.wav", "rb");
for (;xxx == 1;)
{
if (fgetc(fw) == 'f')
{
if (fgetc(fw) == 'm')
{
if (fgetc(fw) == 't')
{
if (fgetc(fw) == ' ')
{
int ask1, zj[6];
for (ask1 = 0;ask1<6;ask1++)
{
fgetc(fw);
}
zj[0] = fgetc(fw);
zj[1] = fgetc(fw) << 8;
zj[2] = fgetc(fw);
zj[3] = fgetc(fw) << 8;
zj[4] = fgetc(fw) << 16;
zj[5] = fgetc(fw) << 24;
shengdao = zj[0] + zj[1];
pinlv = zj[2] + zj[3] + zj[4] + zj[5];
for (ask1 = 0;ask1<6;ask1++)
{
fgetc(fw);
}
zj[0] = fgetc(fw);
zj[1] = fgetc(fw) << 8;
lianghws = zj[0] + zj[1];
xxx = 0;
}
}
}
}
}
int shujudx;
xxx = 1;
for (;xxx == 1;)
{
if (fgetc(fw) == 'd')
{
if (fgetc(fw) == 'a')
{
if (fgetc(fw) == 't')
{
if (fgetc(fw) == 'a')
{
int zj[4];
zj[0] = fgetc(fw);
zj[1] = fgetc(fw) << 8;
zj[2] = fgetc(fw) << 16;
zj[3] = fgetc(fw) << 24;
shujudx = zj[0] + zj[1] + zj[2] + zj[3];
xxx = 0;
}
}
}
}
}
FILE*fws;
fws = fopen("成品.txt","w");
int daxiao = (shujudx / shengdao) / (lianghws / 8);
short* datas = (short*)malloc(daxiao*2);
for (xxx = 0;xxx<daxiao;xxx++)
{
int zj[4];
zj[0] = fgetc(fw);
zj[1] = fgetc(fw) << 8;
if (shengdao==2)
{
zj[2] = fgetc(fw);
zj[3] = fgetc(fw) << 8;
}
else
{
zj[2] = zj[0];
zj[3] = zj[1];
}
datas[xxx] = (zj[0] + zj[1] + zj[0] + zj[1]) / 2;
fputc(datas[xxx],fws);
}
fclose(fw);
fclose(fws);
先打开一个wav文件,识别出fmt标识(利用二进制文件查看软件打开wav可以看到标识wav的知识可以看这里https://blog.csdn.net/jackailson/article/details/105183413)
FILE*fw;
int shengdao;
int pinlv;
int lianghws;
int xxx = 1;
fw = fopen("1.wav", "rb");
for (;xxx == 1;)
{
if (fgetc(fw) == 'f')
{
if (fgetc(fw) == 'm')
{
if (fgetc(fw) == 't')
{
if (fgetc(fw) == ' ')
{
然后获得声道数、频率、量化位数。
int ask1, zj[6];
for (ask1 = 0;ask1<6;ask1++)
{
fgetc(fw);
}
zj[0] = fgetc(fw);
zj[1] = fgetc(fw) << 8;
zj[2] = fgetc(fw);
zj[3] = fgetc(fw) << 8;
zj[4] = fgetc(fw) << 16;
zj[5] = fgetc(fw) << 24;
shengdao = zj[0] + zj[1];
pinlv = zj[2] + zj[3] + zj[4] + zj[5];
for (ask1 = 0;ask1<6;ask1++)
{
fgetc(fw);
}
zj[0] = fgetc(fw);
zj[1] = fgetc(fw) << 8;
lianghws = zj[0] + zj[1];
xxx = 0;
接着识别data标识获得shujudx
if (fgetc(fw) == 'd')
{
if (fgetc(fw) == 'a')
{
if (fgetc(fw) == 't')
{
if (fgetc(fw) == 'a')
{
int zj[4];
zj[0] = fgetc(fw);
zj[1] = fgetc(fw) << 8;
zj[2] = fgetc(fw) << 16;
zj[3] = fgetc(fw) << 24;
shujudx = zj[0] + zj[1] + zj[2] + zj[3];
接着用malloc开辟一个内存块(跟建一个数组差不多)data为其指针,将声音数据录入
int daxiao = (shujudx / shengdao) / (lianghws / 8);
short* datas = (short*)malloc(daxiao*2);
for (xxx = 0;xxx<daxiao;xxx++)
{
int zj[4];
zj[0] = fgetc(fw);
zj[1] = fgetc(fw) << 8;
if (shengdao==2)
{
zj[2] = fgetc(fw);
zj[3] = fgetc(fw) << 8;
}
else
{
zj[2] = zj[0];
zj[3] = zj[1];
}
datas[xxx] = (zj[0] + zj[1] + zj[0] + zj[1]) / 2;
fputc(datas[xxx],fws);
}
最后是alBufferData(),参数分别填缓冲器(Buffer),声音数据格式(AL_FORMAT_MONO16,这是单声道16位),数据指针,数据大小,数据频率。
其余部分照抄就行