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

Delphi Sources



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

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

Я решил разобратся как работают файлы wav, с нуля.
Впринципи почти все понятно.

WAV очень короткий звуковой фрагмент подгружается в буфер
массив байтов
Код:
1
buffer1: array [0..44099] of byte;
ну и после этот короткий отрезок из буфера можно воспроизести через
WaveOutWrite

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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 прекратят поступление информации в программу и закроют доступ к микрофону.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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, время: 02:38.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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