如何创建一个空的WAV文件(100分)? 我在写程序时碰到一个问题:如何创建一个空的WAV文件。同时,如何把WAV文件读出,分成一段一段的在放音? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 创建一个WAV文件不难吧:)这样var F:TFileStream;begin F:=TFileStream.Create('D:\Empty.WAV',fmCreate); F.Free;end;//呵呵,我觉得这样就行。错别怪我哟,凭感觉。 如何把WAV文件读出,分成一段一段的在放音?先把文件头读出来,准备放一段语音时修改一下数据长度即可。比较简单 还不行就给我发mail [email protected] 写入Wav文件头即可建立空文件Type TPCMWaveHeader = record rId : longint; rLen : longint; wId : longint; fId : longint; fLen : longint; wFormatTag : word; nChannels : word; nSamplesPerSec : longint; nAvgBytesPerSec : longint; nBlockAlign : word; wBitsPerSample : word; dId : longint; wSampleLength : longint; end; procedure WritePCMWaveFile(channels : word; resolution : word; rate : longint; filename : string); { channels 1(单声)或者2(立体声) }{ resolution 8或者16,代表8位或16位声音 }{ rate 声音频率,如11025,22050, 44100 }varwf : file of TWavHeader;wh : TWavHeader;beginwh.rId := $46464952; wh.rLen := 36; wh.wId := $45564157; wh.fId := $20746d66; wh.fLen := 16; wh.wFormatTag := 1; wh.nChannels := channels;wh.nSamplesPerSec := rate; wh.nAvgBytesPerSec := channels*rate*(resolution div 8);wh.nBlockAlign := channels*(resolution div 8);wh.wBitsPerSample := resolution;wh.dId := $61746164; wh.wSampleLength := 0; assignfile(wf,filename); {打开对应文件 } rewrite(wf); {移动指针到文件头} write(wf,wh); {写进文件头 } closefile(wf); {关闭文件 } end; { 余下部分是音波(wave)数据。顺序是左声道低-高字节,右声道低-高字节,等等。} m_hFile = ::mmioOpen(pWriteSoundFile->lpszFileName,NULL, MMIO_CREATE | MMIO_WRITE | MMIO_ALLOCBUF); if ( !m_hFile ) return ERROR_SUCCESS; ZeroMemory(&m_MMCKInfoParent, sizeof(MMCKINFO)); m_MMCKInfoParent.fccType = mmioFOURCC('W','A','V','E'); MMRESULT mmResult = ::mmioCreateChunk( m_hFile,&m_MMCKInfoParent, MMIO_CREATERIFF); ZeroMemory(&m_MMCKInfoChild, sizeof(MMCKINFO)); m_MMCKInfoChild.ckid = mmioFOURCC('f','m','t',' '); m_MMCKInfoChild.cksize = cbWaveFormatEx; mmResult = ::mmioCreateChunk(m_hFile, &m_MMCKInfoChild, 0); mmResult = ::mmioWrite(m_hFile, (char*)&pWriteSoundFile->waveFormatEx, cbWaveFormatEx); mmResult = ::mmioAscend(m_hFile, &m_MMCKInfoChild, 0); m_MMCKInfoChild.ckid = mmioFOURCC('d', 'a', 't', 'a'); mmResult = ::mmioCreateChunk(m_hFile, &m_MMCKInfoChild, 0 ); 如何提取Delphi编译环境? dephi插入PostgreSQL数据库的问题! 好奇怪的问题啊,急救 如何用delphi激活frontpage编辑好网页后,保存到delphi的环境中 如何实现DBGrid全部被选中,急!!! 100份求购delphi简单源码,不够再加! NMFTP.List如何得到并且只显示ftp server上的目录? 调用方法时,Delphi6中一种不可思议方式!!!! installshell express问题 delphi 是什么? 为什么RegisterServiceProcess不兼容WindowsXP??? 请问动态域名解析DDNS如何实现?
这样
var
F:TFileStream;
begin
F:=TFileStream.Create('D:\Empty.WAV',fmCreate);
F.Free;
end;//呵呵,我觉得这样就行。错别怪我哟,凭感觉。
先把文件头读出来,
准备放一段语音时修改一下数据长度即可。比较简单
[email protected]
TPCMWaveHeader = record
rId : longint;
rLen : longint;
wId : longint;
fId : longint;
fLen : longint;
wFormatTag : word;
nChannels : word;
nSamplesPerSec : longint;
nAvgBytesPerSec : longint;
nBlockAlign : word;
wBitsPerSample : word;
dId : longint;
wSampleLength : longint;
end;
procedure WritePCMWaveFile(channels : word; resolution : word; rate : longint; filename : string);
{ channels 1(单声)或者2(立体声) }
{ resolution 8或者16,代表8位或16位声音 }
{ rate 声音频率,如11025,22050, 44100 }
var
wf : file of TWavHeader;
wh : TWavHeader;
begin
wh.rId := $46464952;
wh.rLen := 36;
wh.wId := $45564157;
wh.fId := $20746d66;
wh.fLen := 16;
wh.wFormatTag := 1;
wh.nChannels := channels;
wh.nSamplesPerSec := rate;
wh.nAvgBytesPerSec := channels*rate*(resolution div 8);
wh.nBlockAlign := channels*(resolution div 8);
wh.wBitsPerSample := resolution;
wh.dId := $61746164;
wh.wSampleLength := 0;
assignfile(wf,filename); {打开对应文件 }
rewrite(wf); {移动指针到文件头}
write(wf,wh); {写进文件头 }
closefile(wf); {关闭文件 }
end;
{ 余下部分是音波(wave)数据。顺序是左声道低-高字节,右声道低-高字节,等等。}
m_hFile = ::mmioOpen(pWriteSoundFile->lpszFileName,NULL, MMIO_CREATE | MMIO_WRITE | MMIO_ALLOCBUF);
if ( !m_hFile )
return ERROR_SUCCESS; ZeroMemory(&m_MMCKInfoParent, sizeof(MMCKINFO)); m_MMCKInfoParent.fccType = mmioFOURCC('W','A','V','E');
MMRESULT mmResult = ::mmioCreateChunk( m_hFile,&m_MMCKInfoParent,
MMIO_CREATERIFF);
ZeroMemory(&m_MMCKInfoChild, sizeof(MMCKINFO));
m_MMCKInfoChild.ckid = mmioFOURCC('f','m','t',' ');
m_MMCKInfoChild.cksize = cbWaveFormatEx; mmResult = ::mmioCreateChunk(m_hFile, &m_MMCKInfoChild, 0); mmResult = ::mmioWrite(m_hFile, (char*)&pWriteSoundFile->waveFormatEx, cbWaveFormatEx); mmResult = ::mmioAscend(m_hFile, &m_MMCKInfoChild, 0); m_MMCKInfoChild.ckid = mmioFOURCC('d', 'a', 't', 'a');
mmResult = ::mmioCreateChunk(m_hFile, &m_MMCKInfoChild, 0 );