VC++初步实现保存数据为音频WAV文件
先行基本知識見此
https://blog.csdn.net/bcbobo21cn/article/details/109087252
?
win7, vc6;新建一個對話框工程;添加一個文本框;為文本框添加一個對話框類的成員變量;文本框用來輸入一些數據;
對話框cpp文件頭部加入;
#include<mmsystem.h>
#include<mmreg.h>
......
/*
typedef struct{
?? ? ?WORD ?wFormatTag;?
?? ? ?WORD nChannels;?
?? ? ?DWORD nSamplesPerSec;?
?? ? ?DWORD nAvgBytesPerSec;
?? ? ?WORD ?nBlockAlign;?
?? ? ?WORD wBitsPerSample;?
?? ? ?WORD ?cbSize; } WAVEFORMATEX;
typedef struct {
?? ?LPSTR lpData;?
?? ?DWORD dwBufferLength;?
?? ?DWORD dwBytesRecorded;?
?? ?DWORD dwUser;?
?? ?DWORD dwFlags;?
?? ?DWORD dwLoops;?
?? ?struct wavehdr_tag * lpNext;?
?? ?DWORD reserved; } WAVEHDR;?
?? ?*/
這兩個結構體不用自己定義;包含前面兩個頭文件就有了;
#pragma ?comment(lib, "winmm.lib"),引入音頻操作庫;
WAVEFORMATEX waveform; 定義格式結構體變量;
添加一個按鈕;按鈕處理代碼如下;
void CWavtestDlg::OnButton1() {// TODO: Add your control notification handler code hereDWORD dwDataLength = 50;CFile m_file;CFileException fileException;CString m_csFileName= "S:\\testaudio.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);unsigned int Sec=(50 + 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));UpdateData(TRUE);char* pchar=new char[100];pchar=m_wavdata.GetBuffer(m_wavdata.GetLength());m_file.Write(pchar,dwDataLength);m_file.Seek(dwDataLength,CFile::begin);m_file.Close(); }UpdateData(TRUE);
char* pchar=new char[100];
pchar=m_wavdata.GetBuffer(m_wavdata.GetLength());
m_file.Write(pchar,dwDataLength);
獲取文本框數據,轉換為char *類型,通過調用CString的GetBuffer函數;因為文件的Write函數的第一個參數是void * 類型,char * 可直接寫入;
運行程序;輸入一堆111...;點保存按鈕;看下能不能把輸入的數據保存為音頻wav文件;
保存以后,磁盤上出來一個wav文件;
但是不能播放;
可能保存的格式,什么地方不對;
先大體看一下;
? ? m_file.Write("RIFF",4);? ?文件中先寫入"RIFF"四個字符,沒錯,頭四個字節是固定的,文件標識符;
?? ?//unsigned int Sec=(sizeof pSaveBuffer + m_WaveHeaderSize);
?? ?unsigned int Sec=(50 + m_WaveHeaderSize);
?? ?m_file.Write(&Sec,sizeof(Sec));? ?然后寫入一個4字節,是一個尺寸(長度)值,可能是數據加文件頭部的長度;
?? ?m_file.Write("WAVE",4);? 然后寫入"WAVE"四個字符,沒錯;
?? ?m_file.Write("fmt ",4);? ?然后寫入"fmt "四個字節,感覺到這里可能有問題;
往下沒時間細看了;先到此;
找到2個wave文件解析和編程詳細些的資料,記一下先;
https://www.cnblogs.com/lidabo/p/3701959.html
https://www.cnblogs.com/tocy/p/WAV_file-format.html
?
?
總結
以上是生活随笔為你收集整理的VC++初步实现保存数据为音频WAV文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows下调试PostGreSQL
- 下一篇: C++ 二维数组示例 - 控制台和MFC