平台:wince6.0 vs2008 vc++
请教:如何根据频率、音量大小和持续时间,生成wav音频文件wav文件的格式我知道,就是其中的音频数据不知道和频率、音量如何对应的。void Create(int freq, int volume, int durations)
{
。
}
请教:如何根据频率、音量大小和持续时间,生成wav音频文件wav文件的格式我知道,就是其中的音频数据不知道和频率、音量如何对应的。void Create(int freq, int volume, int durations)
{
。
}
解决方案 »
- 想开发个网页表单提交程序,比如说,不用打开网页,也能在网上发贴的程序
- 找工作ing[上海]
- 如何使用Boost XML序列化派生于CObject的对象
- 聘:软件工程师
- 恭喜一个星期从二星升到三星,散分!一人5分,先到先得。
- 我想通过菜单选择在同一数据源中从一个记录表转到另一个应该怎么办?我试用m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,"SELECT * from ...");
- 如何在系统菜单中加入选项?
- VC++实在是太难学了,哪位大仙能指条明路?
- 请问SYSTEM(“CD DIR”)函数中STR可不可以为字符串变量,可以的话请问代码如何写
- C#调用C++,出错"尝试读取或写入受保护的内存。这通常指示其他内存已损坏"
- 如何获取文件正在写的状态
- 怎么通过蓝牙连接手机,获取手机上的短信
补充:比如我要生成1段1KHZ,音量为80,持续500ms的wav文件,该怎么编写音频数据格式??
补充:比如我要生成1段1KHZ,音量为80,持续500ms的wav文件,该怎么编写音频数据格式??
你什么基础数据都没有
楞写一个wav文件出来?
就是写函数生成一个wav文件,相当于能发出像Beep(freq, durations)的声音。
//.wav文件的文件头结构
typedef struct
{
char chRIFF[4];
DWORD dwRIFFLen;
char chWAVE[4];
char chFMT[4];
DWORD dwFMTLen;
PCMWAVEFORMAT pwf;
char chDATA[4];
DWORD dwDATALen;
//UINT8* pBufer;
}WaveHeader;//生成wav文件:单通道、8bit、44.1KHZ
BOOL CWaveFunction::Create(int freq, int volume, int durations)
{
DWORD totalLen = (m_samplefreq * m_channels * m_channelbits / 8) * durations / 1000 + 44; //文件总长度=(采样率 * 通道数 * 比特数 / 8) * 持续时间(s)
pHeader->chRIFF[0] = 'R';
pHeader->chRIFF[1] = 'I';
pHeader->chRIFF[2] = 'F';
pHeader->chRIFF[3] = 'F';
pHeader->dwRIFFLen = totalLen - 8; //文件的总长度-8bits pHeader->chWAVE[0] = 'W';
pHeader->chWAVE[1] = 'A';
pHeader->chWAVE[2] = 'V';
pHeader->chWAVE[3] = 'E'; pHeader->chFMT[0] = 'f';
pHeader->chFMT[1] = 'm';
pHeader->chFMT[2] = 't';
pHeader->chFMT[3] = ' '; pHeader->dwFMTLen = 0x0010; //一般情况下Size为16,如果为18则最后多了2个字节的附加信息
pHeader->pwf.wf.wFormatTag = 0x0001; //编码方式
pHeader->pwf.wf.nChannels = m_channels; //1为单通道,2为双通道
pHeader->pwf.wf.nSamplesPerSec = m_samplefreq; //=44.1KHz
pHeader->pwf.wf.nAvgBytesPerSec = m_samplefreq * m_channels * m_channelbits / 8; //每秒所需字节数
pHeader->pwf.wf.nBlockAlign = 0x0002; //一次处理多个该值大小的字节数据
pHeader->pwf.wBitsPerSample = m_channelbits; //16位,即设置PCM的方式为16位立体声(双通道) pHeader->chDATA[0] = 'd';
pHeader->chDATA[1] = 'a';
pHeader->chDATA[2] = 't';
pHeader->chDATA[3] = 'a';
pHeader->dwDATALen = totalLen - WAVE_HEAD_LENGTH; //数据的长度,=文件总长度-头长度(44bit) if(pWaveBufer!=NULL)
delete pWaveBufer;
pWaveBufer = new char[pHeader->dwRIFFLen + 8]; //音频数据
memcpy(pWaveBufer, pHeader, WAVE_HEAD_LENGTH); MakeWaveData(pHeader->pwf.wf.nSamplesPerSec, freq, volume, pWaveBufer + WAVE_HEAD_LENGTH, pHeader->dwDATALen);
CFile m_file;
CFileException fileException;
CString m_csFileName= _T("\\NandFlash\\111.wav");//保存路径
m_file.Open(m_csFileName,CFile::modeCreate|CFile::modeReadWrite, &fileException);
m_file.SeekToBegin();
//m_file.Write(pHeader, 44);
m_file.Write(pWaveBufer, pHeader->dwRIFFLen + 8);
m_file.Seek(pHeader->dwDATALen,CFile::begin);
m_file.Close();
return TRUE;
}void CWaveFunction::MakeWaveData(int rate, int freq, int amp, char* p, int len)
{
if(m_channelbits == 16) //16位
{
for(int i = 0; i < len; i+=2)
{
INT32 v = (INT32)(sin((len - i) * (MATH_PI * 2) / rate * freq) * amp * 32768 / 100 + 32768);
*(p + i) = (v & 0x00FF); //低字节在前
*(p + i + 1) = ((v >> 4) & 0xFF); //高字节在后
} }
else if(m_channelbits == 8)
{
for(int i = 0; i < len; i+=1)
{
*(p + i) = sin((len - i) * (MATH_PI * 2) / rate * freq) * amp * 128 / 100 + 128;
}
}
}