志,第一个四字节的标志是 ascii 的 "WAVE" ,第二个 四字节的标志就是 ascii 的 "fmt "(注意,有一个空格),然后剩下的四字节里面藏的是 WAVEFORMATEX 结构的大小(参照MSDN),应该是18个字节。
然后,当然就是 18个字节的 WAVEFORMATEX 结构里面的值。详细的就不说了,自己查一下 MSDN。 (需要注意的是,这个 WAVEFORMATEXEX 的末一个成员,讲了可能的长度扩充)
在这 18 个字节后面 (按照旧时候的方法),应该是跟着一个8字节的结构的,然后就是 "裸数据" 的开始地址了,这八字节结构的开始四字节是标志,应该等于 ascii 的 "data",然后紧跟着的四字节就是裸数据的大小了,也就是最重要的部分。
好了,如此一来,你就可以得到音频裸数据的起始位置(紧紧跟在含"data"标志的数据结构的后面),还有就是音频数据的长度了。应该是所有的
问题都很容易解决的。
不过,还要注意,就是现在的很多 .wav 文件都会外加一个数据结构(12字节),就插在 WAVEFORMATEX 的后面和 含 "data" 的数据结构前面。 这个外加的结构 第一个四字节是标志,等于 ascii 码的 "fact",然后第二个四字节的值在大部分情况下都等于 4, 第三个四字节的值也是等于 音频裸数据的长度。 基本上就是这样了。
下面给出的源
程序文件只要加进新建的 VC win32工程中,编译即可,执行效果是录音三秒后自动生成 mytest.wav 文件供播放测试(记得选好默认录音通道)。
废话不多说,给出源程序(该源
程序中要包含 RunTimeLog.cpp,见http://www.csdn.net/develop/Read_Article.
asp?Id=17477) 希望对大家有用。(全文完)
(全文完 - 2003年03月27日_am: 11时27分)
// ******************* FileName: WinMain.cpp *****************************
// 该源
程序需要加入到 VC6 的 Win32 Application 的 empty Project 中
// 请包含我自定义的调试类,见 #include "RunTimeLog.cpp"
// 对于工程的 Link 选项,至少要包含以下库: msvcrt.lib kernel32.lib user32.lib Winmm.lib
#define WIN32_LEAN_AND_MEAN // Say No to MFC !!
#include <windows.h>
#include <Mmsystem.h>
#include "RunTimeLog.cpp"
RunTimeLog log;
char lpTemp[256]="";
DWORD FCC(LPSTR lpStr)
{
DWORD Number = lpStr[0] + lpStr *0x100 + lpStr *0x10000 + lpStr *0x1000000 ;
return Number;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
CreateMutex( NULL, false, "MyMutex");
if ( GetLastError() == ERROR_ALREADY_EXISTS )
{ log.write("Exists and Exit"); log.last(); ExitProcess( NULL); }
log.write("Program Start.");
log.nobuff = true;
DWORD datasize = 48000;
// 最常用法
WAVEFORMATEX waveformat;
waveformat.wFormatTag=WAVE_FO