全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1273
推到 Plurk!
推到 Facebook!

擷取Audio Data

 
huei_brother
一般會員


發表:36
回覆:15
積分:10
註冊:2004-08-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-07-11 21:30:10 IP:211.76.xxx.xxx 訂閱

板上各位前輩大家好小弟最近參考書籍和板上文章寫了一個抓取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]

系統時間:2024-05-02 12:04:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!