日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

VC++初步实现保存数据为音频WAV文件

發布時間:2025/4/14 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。