Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.04.2012, 19:04
Аватар для -sanya-
-sanya- -sanya- вне форума
Новичок
 
Регистрация: 14.04.2009
Сообщения: 64
Репутация: 20
По умолчанию Захват звука с микрофона в буфер

Я решил разобратся как работают файлы 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  
Старый 12.04.2012, 19:39
Аватар для -sanya-
-sanya- -sanya- вне форума
Новичок
 
Регистрация: 14.04.2009
Сообщения: 64
Репутация: 20
По умолчанию

Все сам нашел как это делается

Цитата:
Для получения звукового сигнала нужно воспользоваться WinAPI. WaveInOpen открывает доступ к микрофону. Одновременно только одна программа может работать с микрофоном. Заодно Вы указываете, какая нужна частота, сколько бит на значение и размер буфера. От последнего зависит, как часто и в каком объеме информация будет поступать в программу.

Далее нужно выделить память для буфера и вызвать функцию WaveInAddBuffer, которая передаст Windows пустой буфер. После вызова WaveInStart Windows начнет заполнять буфер, и, после его заполнения, пошлет сообщение MM_WIM_DATA. В нем нужно обработать полученную информацию и вновь вызвать WaveInAddBuffer, тем самым указав, что буфер пуст.

Функции WaveInReset и WaveInClose прекратят поступление информации в программу и закроют доступ к микрофону.

Код:
 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 микрофона?
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter