板上各位前輩大家好小弟最近參考書籍和板上文章寫了一個抓取Audio的程式但是再讀取Data時發現
" 相同音訊" 來源但其讀取出來的Data每次跑出來都不一樣以下我把我的Code貼出來請大家幫我一下謝謝
[code]
#include
HWAVEIN hWaveIn;
WAVEHDR *WaveHeaders;
WAVEFORMATEX waveFormat;
WAVEHDR *SendHeader;
int buff;
int buffers;
int buffer_size;
int WaveBufSize;
bool isStart;
// 開啟影片
void __fastcall TForm1::OpenVideos1Click(TObject *Sender)
{
if(OpenDialog1->Execute())
{
WindowsMediaPlayer1->URL=OpenDialog1->FileName.c_str();
Timer1->Enabled = true;
}
}
// 定義音訊相關格式及開啟音訊裝置
void TForm1::OpenAudio()
{
int i;
buffers = 2;
buffer_size = 1024;
buff = 0;
waveFormat.wFormatTag = WAVE_FORMAT_PCM;
waveFormat.nChannels = 2;
waveFormat.nSamplesPerSec = 16000;
waveFormat.wBitsPerSample = 16;
waveFormat.nBlockAlign = waveFormat.wBitsPerSample/8*waveFormat.nChannels;
waveFormat.nAvgBytesPerSec = waveFormat.nBlockAlign*waveFormat.nSamplesPerSec;
waveFormat.cbSize = 0;
WaveHeaders = new WAVEHDR[buffers];
WaveBufSize = buffer_size*waveFormat.wBitsPerSample/8*waveFormat.nChannels;
for(i=0;i {
WaveHeaders[i].dwBufferLength = WaveBufSize;
WaveHeaders[i].lpData = (char*)VirtualAlloc(0,WaveBufSize,MEM_COMMIT,PAGE_READWRITE);
}
if(waveInOpen(&hWaveIn,WAVE_MAPPER,&waveFormat,0,(DWORD)this,CALLBACK_FUNCTION) == MMSYSERR_NOERROR)
{
for(i=0;i {
WaveHeaders[i].dwBufferLength = WaveBufSize;
WaveHeaders[i].dwFlags = 0;
WaveHeaders[i].dwLoops = 0;
if(waveInPrepareHeader(hWaveIn,&WaveHeaders[i],sizeof(WAVEHDR))== MMSYSERR_NOERROR)
if(waveInAddBuffer(hWaveIn,&WaveHeaders[i],sizeof(WAVEHDR))!= MMSYSERR_NOERROR)
{
Application->MessageBox("Error","Multimedia Error",MB_OK);
Application->Terminate();
}
}
if(waveInStart(hWaveIn) == MMSYSERR_NOERROR)
{
SendHeader = &WaveHeaders[buffers/2];
buff = 0;
isStart = true;
}
else
{
Application->MessageBox("Error","Multimedia Error",MB_OK);
Application->Terminate();
}
}
else
{
Application->MessageBox("Error","Multimedia Error",MB_OK);
Application->Terminate();
}
}
// 關閉音訊裝置
void TForm1::CloseAudio()
{
int i;
isStart = false;
MMRESULT res = waveInReset(hWaveIn);
for(i=0;i {
res = waveInUnprepareHeader(hWaveIn,&WaveHeaders[i],sizeof(WAVEHDR));
while(res == WAVERR_STILLPLAYING )
{
Sleep(200);
res = waveInUnprepareHeader(hWaveIn,&WaveHeaders[i],sizeof(WAVEHDR));
}
}
waveInClose(hWaveIn);
for(i=0;i VirtualFree(WaveHeaders[i].lpData,0,MEM_RELEASE);
delete [] WaveHeaders;
}
//讀取音訊Data
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if(isStart == true)
{
if(WindowsMediaPlayer1->playState == true)
{
Timer1->Enabled = false;
}
WAVEHDR *in = &WaveHeaders[buff];
waveInUnprepareHeader(hWaveIn,in,sizeof(WAVEHDR));
Test((short *)(in->lpData)); //將Data送出
buff ;
if( buff == buffers )
buff = 0;
SendHeader->dwBufferLength = WaveBufSize;
SendHeader->dwFlags = 0;
SendHeader->dwLoops = 0;
waveInPrepareHeader(hWaveIn,SendHeader,sizeof(WAVEHDR));
waveInAddBuffer(hWaveIn,SendHeader,sizeof(WAVEHDR));
if( SendHeader == &WaveHeaders[buffers - 1] )
SendHeader = &WaveHeaders[0];
else
SendHeader ;
}
}
[code]