Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];

Вниз

Звук с микрофона или LineIn   Найти похожие ветки 

 
Yurko   (2003-02-09 01:27) [0]

Как получить звук с микофона или LineIn и визуализировать его в RealTime?
Помогите, пожалуйста, кодом или ссылкой.


 
Saracin   (2003-02-09 13:28) [1]

ссылаю на MSDN:
Platform SDK/Graphics and Multimedia Services/Windows Multimedia/Multimedia Audio/Waveform Audio/Waveform Audio Reference там смотри Recording


 
Yurko   (2003-02-10 23:48) [2]

Неужели никто не работал со звуком?


 
Saracin   (2003-02-11 00:21) [3]

а этой ссылки тебе не достаточно ???
Могу посоветовать еще интерфейс MCI (но возникнут проблемы с визуализацией в real-time) есть еще способ использовать DirectSound, выбирай что нужно. Но на мой взягляд WaveAudio наиболее удачно не надо инициализировать COM-подсистему (для DirectSound) но все зависит от задачи.


 
Yurko   (2003-02-11 23:52) [4]

Если есть пример использования MCI, то поделитесь со мной, пожалуйста.


 
Saracin   (2003-02-12 01:03) [5]

MCI тут не поможет (насколько я понял твою задачу) MCI - media CONTROL interface, т.е. максимум что ты сможешь сделать это воспроизвести файлы (заметь файлы) и записать их, там много наворотов как ты можешь это делать (типа микшера ивсе такое), но ты не получишь доступ к данным (например значение n-ой выбоки). Сдесь тебе поможет Wave Audio. У меня сгорела электроника на винте (такойже найти немогу для замены) я бы кинул пример, но сейчас никак нет времяни писать работающий пример. Но поверь когда я разбирался пользовался только MSDN и этого хватило.


 
imbicil   (2003-02-12 11:56) [6]

Я ето решил вот так. Обьясняю...

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

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

Эта программа считывает сигнал с микрофона и выводит его на экран. Частота сигнала - 22050 Гц. Количество бит определяется флажком, размер буфера TrackBar-ом.

unit Unit1;

interface

uses
Windows, ..., MMSystem;

type
TData8 = array [0..127] of byte;
PData8 = ^TData8;
TData16 = array [0..127] of smallint;
PData16 = ^TData16;
TPointArr = array [0..127] of TPoint;
PPointArr = ^TPointArr;
TForm1 = class(TForm)

...

public
procedure OnWaveIn(var Msg: TMessage); message MM_WIM_DATA;
end;

...

implementation

...

var
WaveIn: hWaveIn;
hBuf: THandle;
BufHead: TWaveHdr;
bufsize: integer;
Bits16: boolean;
p: PPointArr;
stop: boolean = false;

procedure TForm1.Button1Click(Sender: TObject);
var
header: TWaveFormatEx;
BufLen: word;
buf: pointer;
begin
BufSize := TrackBar1.Position * 500 + 100; { Размер буфера }
Bits16 := CheckBox1.Checked;
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);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if stop = false then Exit;
stop := false;
while not stop do Application.ProcessMessages;
stop := false;
WaveInReset(WaveIn);
WaveInUnPrepareHeader(WaveIn, addr(BufHead), sizeof(BufHead));
WaveInClose(WaveIn);
GlobalUnlock(hBuf);
GlobalFree(hBuf);
FreeMem(p, BufSize * sizeof(TPoint));
end;

procedure TForm1.OnWaveIn;
var
i: integer;
data8: PData8;
data16: PData16;
h: integer;
XScale, YScale: single;
begin
h := PaintBox1.Height;
XScale := PaintBox1.Width / BufSize;
if Bits16 then begin
data16 := PData16(PWaveHdr(Msg.lParam)^.lpData);
YScale := h / (1 shl 16);
for i := 0 to BufSize - 1 do
p^[i] := Point(round(i * XScale),
round(h / 2 - data16^[i] * YScale));
end else begin
Data8 := PData8(PWaveHdr(Msg.lParam)^.lpData);
YScale := h / (1 shl 8);
for i := 0 to BufSize - 1 do
p^[i] := Point(round(i * XScale),
round(h - data8^[i] * YScale));
end;
with PaintBox1.Canvas do begin
Brush.Color := clWhite;
FillRect(ClipRect);
Polyline(Slice(p^, BufSize));
end;
if stop
then WaveInAddBuffer(WaveIn, PWaveHdr(Msg.lParam),
SizeOf(TWaveHdr))
else stop := true;
end;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
TrackBar1.OnChange := CheckBox1Click;
Button1.Caption := "Start";
Button2.Caption := "Stop";
CheckBox1.Caption := "16 / 8 bit";
end;

end.


 
imbicil   (2003-02-12 11:59) [7]

если хочеш поподробнее или помощь получить просто намыль мне и все...



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.007 c
9-83313
albom
2002-12-13 01:09
2003.05.26
Вращение камеры


1-83606
AbrosimovA
2003-05-14 08:52
2003.05.26
Как прочитать файл данных тренда


7-83777
_sMile
2003-03-25 12:00
2003.05.26
Сжатие в памяти


1-83476
Zigs
2003-05-14 21:04
2003.05.26
Запуск макроса Excel c параметрами из Delphi


4-83805
mikeevteev
2003-02-17 21:07
2003.05.26
Как создать большой хинт для tray icon?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский