|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Захват звука с микрофона в буфер
Я решил разобратся как работают файлы wav, с нуля.
Впринципи почти все понятно. WAV очень короткий звуковой фрагмент подгружается в буфер массив байтов Код:
buffer1: array [0..44099] of byte; WaveOutWrite Код:
procedure TForm1.PlayBuffer(soundBuffer: array of byte); var i, err: integer; begin with header do begin wFormatTag := WAVE_FORMAT_PCM; nChannels := 1; nSamplesPerSec := 44100; wBitsPerSample := 8; nBlockAlign := nChannels * (wBitsPerSample div 8); nAvgBytesPerSec := nSamplesPerSec * nBlockAlign; cbSize := 0; end; if Opened = false then begin err:=WaveOutOpen(addr(waveOut), 0, @header, Handle, 0, CALLBACK_WINDOW); if Err <> 0 then Exit; for i:=0 to 1 do begin pBuf[i] := GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, length(soundBuffer)); pBuffer[i]:=GlobalLock(pBuf[i]); with outHdr[i] do begin lpData := pbuffer[i]; dwBufferLength := length(soundBuffer); dwUser := 0; dwFlags := 0; dwLoops := 0; end; err:=WaveOutPrepareHeader(waveOut, @outHdr[i], sizeof(outHdr)); if Err <> 0 then Exit; copyMemory(pBuffer[i], @soundBuffer, length(soundBuffer)); err:=WaveOutWrite(waveOut, @outHdr[i], sizeof(outHdr)); if Err <> 0 then Exit; end; end else begin for i:=0 to 1do copyMemory(pBuffer[i], @soundBuffer, length(soundBuffer)); end; end; И так далее wav файл постепенно подгружается в буфер и выводится на звуковую карту Теперь вопрос. Мне нужно как то получить с микрофона звуковой фрагмент в buffer1. Но как это сделать ума нехватает, прошу помоч советом. Мне это нужно что бы потом графически отобразить, шум в микрофоне, и при определенном уровне шума выполнить действие. Разбирался недавно как работает гугловская программа для перевода речи в текст, на удивление русская речь переводится на 90% успешно. Вот и хотел сделать програмку что бы по двойному хлопку в ладоши программа включала переводчик речи в текст и делала запрос в ютубе. Что бы не вставая с дивана просматривать ютуб) Последний раз редактировалось -sanya-, 12.04.2012 в 19:10. |
#2
|
||||
|
||||
Все сам нашел как это делается
Цитата:
Код:
with header do begin wFormatTag := WAVE_FORMAT_PCM; nChannels := 1; { количество каналов } nSamplesPerSec := 22050; { частота } wBitsPerSample := integer(Bits16) * 8 + 8; { 8 / 16 бит } nBlockAlign := nChannels * (wBitsPerSample div 8); nAvgBytesPerSec := nSamplesPerSec * nBlockAlign; cbSize := 0; end; WaveInOpen(Addr(WaveIn), WAVE_MAPPER, addr(header), Form1.Handle, 0, CALLBACK_WINDOW); BufLen := header.nBlockAlign * BufSize; hBuf := GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, BufLen); Buf := GlobalLock(hBuf); with BufHead do begin lpData := Buf; dwBufferLength := BufLen; dwFlags := WHDR_BEGINLOOP; end; WaveInPrepareHeader(WaveIn, Addr(BufHead), sizeof(BufHead)); WaveInAddBuffer(WaveIn, addr(BufHead), sizeof(BufHead)); GetMem(p, BufSize * sizeof(TPoint)); stop := true; WaveInStart(WaveIn); Но возникла другая проблема, я получаю звук с микрофона звуковой карты, а у меня микрофон usb от веб камеры, что сделать что бы захват звука был с usb микрофона? |