用waveIn采集音频数据,保存到记录文件里。记录格式如下:
audioData=packed record
lpdata:PChar;
dwbufferlength:DWORD;
dwbytesrecorded:DWORD;
dwUser:DWORD;
dwflags:DWORD;
dwloops:DWORD;
buffer : array [0..500] of byte;
end;
每次从文件里读取一个记录,并传给waveOutPrepareHeader时,就会提示参数不合法。读取文件代码如下:
var
Header:PWaveHdr;
file_size,CurRec:integer;
ad:audioData;
filename:string;
begin
filename:='new.abc';
AssignFile(WavFile,filename);
reset(WavFile); }
file_size:=filesize(wavFile);
CurRec:=0;
Header:=new(PWaveHdr);
while CurRec < file_size do
begin
seek(wavFile,CurRec);
inc(CurRec);
read(wavFile,ad);
Header.dwBufferLength:=ad.dwbufferlength;
Header.dwBytesRecorded:=0;
Header.dwUser:=ad.dwUser;
Header.dwFlags:=ad.dwflags;
Header.dwLoops:=0;
Header.lpData:=pointer(@ad.buffer); i:=waveOutPrepareHeader(HWaveOut^,Header,sizeof(Header));
if i<>MMSYSERR_NOERROR then application.messagebox('Out Prepare error','error',mb_ok);
i:=waveOutWrite(HWaveOut^,Header,sizeof(TWaveHdr));
if i<>MMSYSERR_NOERROR then application.messagebox('Wave out error','error',mb_ok);
end;
end;问题:
这样保存音频数据是否正确,还有我用的这种播放音频数据的方法是否正确?问题应该怎样解决?
多谢各位了!!
audioData=packed record
lpdata:PChar;
dwbufferlength:DWORD;
dwbytesrecorded:DWORD;
dwUser:DWORD;
dwflags:DWORD;
dwloops:DWORD;
buffer : array [0..500] of byte;
end;
每次从文件里读取一个记录,并传给waveOutPrepareHeader时,就会提示参数不合法。读取文件代码如下:
var
Header:PWaveHdr;
file_size,CurRec:integer;
ad:audioData;
filename:string;
begin
filename:='new.abc';
AssignFile(WavFile,filename);
reset(WavFile); }
file_size:=filesize(wavFile);
CurRec:=0;
Header:=new(PWaveHdr);
while CurRec < file_size do
begin
seek(wavFile,CurRec);
inc(CurRec);
read(wavFile,ad);
Header.dwBufferLength:=ad.dwbufferlength;
Header.dwBytesRecorded:=0;
Header.dwUser:=ad.dwUser;
Header.dwFlags:=ad.dwflags;
Header.dwLoops:=0;
Header.lpData:=pointer(@ad.buffer); i:=waveOutPrepareHeader(HWaveOut^,Header,sizeof(Header));
if i<>MMSYSERR_NOERROR then application.messagebox('Out Prepare error','error',mb_ok);
i:=waveOutWrite(HWaveOut^,Header,sizeof(TWaveHdr));
if i<>MMSYSERR_NOERROR then application.messagebox('Wave out error','error',mb_ok);
end;
end;问题:
这样保存音频数据是否正确,还有我用的这种播放音频数据的方法是否正确?问题应该怎样解决?
多谢各位了!!
解决方案 »
- combobox下拉框中显示有两列,但选择时,只让第一列的内容出现在combobox的text中,请问如何实现?
- 怎么捕获存储过程的错误
- 为什么会出现socket Error #10054 Connection resetby peer错误提示
- 喜欢DELPHI的人是不是都很多情?还是我们的观点与众不同?
- 谁能给一段最为简单的文件复制代码,包括目录(不管什么文件,)
- 为什么显示的就只有"当前用户:",是Y没有赋值成功还是别的原因?
- 请问DBExpress连接Oracle8i的问题
- 大家看看这个程序该怎么写
- dbgrid中的浮点数字段怎么加上千位分隔符?如何限定小数位数?
- Delphi 5无法单步调试了.需要设置什么地方?
- 急寻Delphi/C++兼职高手:
- 如果您反对日本成为联合国安理会常任理事国,请在此签名。谢谢!
PCMFOMAT: TWAVEFORMATEX =
(wFormatTag: WAVE_FORMAT_PCM;
nChannels: 1;
nSamplesPerSec: 8000;
nAvgBytesPerSec: 16000;
nBlockAlign: 2;
wBitsPerSample: 16;
cbSize: 0;
);然后后面就只记录采集到的音频数据(二进制),比如采集10秒钟记录一次(本例中采集10秒会有160000个Byte的数据)。回放的时候就先读出音频格式那个结构用于初始化WaveOut,然后再循环读出160000个Byte进行回放。另外存文件时可以加入压缩过程,然后读出数据解压后再进行回放。
代码如下:
//play audio button
procedure TForm1.Button3Click(Sender: TObject);
var
Header:PWaveHdr;
i,file_size:integer;
wv_buffer: array of byte;
begin
file_size:=filesize(wavFile);
Header:=new(PWaveHdr);
setLength(wv_buffer,file_size);
seek(wavfile,0);
//读取音频数据/
for i:=0 to file_size-1 do
begin
read(wavfile,wv_buffer[i]);
end; Header.dwBufferLength:=file_size;
Header.dwBytesRecorded:=0;
Header.dwUser:=0;
Header.dwFlags:=2;//WHDR_BEGINLOOP or WHDR_ENDLOOP;
Header.dwLoops:=0;
Header.lpNext:=nil;
Header.reserved:=0;
Header.lpData:=pointer(wv_buffer);
i:=waveOutPrepareHeader(HWaveOut^,Header,sizeof(TWavehdr));
if i<>MMSYSERR_NOERROR then application.messagebox('Out Prepare error','error',mb_ok); i:=waveOutWrite(HWaveOut^,Header,sizeof(PWaveHdr));
if i<>MMSYSERR_NOERROR then application.messagebox('Wave out error','error',mb_ok);end;