Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
-4 / 0 / 0
Регистрация: 13.11.2015
Сообщений: 488
1

Реализовать захват звука с микрофона и его воспроизведение

19.05.2017, 18:16. Просмотров 1508. Ответов 2
Метки нет (Все метки)

Мне необходимо реализовать захват звука с микрофона и его воспроизведение. Набросал такой код по этой статье: http://www.programmersclub.ru/... voip-теле/
Только мне не надо его передавать на другой комп, а сразу воспроизвести после получения звука с микро. Вот мой код
Delphi
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,mmsystem, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    procedure OnWaveMessage(var msg:TMessage); message MM_WIM_DATA;
    procedure opengem;
    procedure playson(p:PansiChar);
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  Wavein:HWAVEIN;
  WaveOut:HWAVEOUT;
  WaveHdr:TWaveHdr;
  WaveHdr1:TWaveHdr;
  bufsize:Cardinal;
  WaveDataLength:integer;
  bytes:integer;
  device:word;
  waveformat: TWAVEFORMATEX;
  WaveFormatOut: tWAVEFORMATEX;
  a:integer;
implementation
 
{$R *.dfm}
 
procedure TForm1.OnWaveMessage(var msg: TMessage);
begin
  waveInPrepareHeader(wavein,@WaveHdr,sizeof(Twavehdr));
  waveInAddBuffer(wavein,@WaveHdr,sizeof(TwaveHdr));
  playson(WaveHdr.lpData);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  opengem;
end;
 
procedure TForm1.opengem;
begin
  WaveOut:= 0;
  with waveformat do
  begin
    nChannels:=1;
    wFormatTag:=WAVE_FORMAT_PCM;
    nSamplesPerSec:=8000;
    wBitsPerSample:=8;
    nBlockAlign:=1;
    nAvgBytesPerSec:=8000;
    cbSize:=0;
  end;
 
  With WaveFormatOut do
  begin
    nChannels:= 1;
    wFormatTag:= WAVE_FORMAT_PCM;
    nSamplesPerSec:= 8000;
    wBitsPerSample:= 8;
    nBlockAlign:= 1;
    nAvgBytesPerSec:= 8000;
    cbSize:= 0
  end;
  with WaveHdr1 do
  begin
    dwFlags:= WHDR_INQUEUE;
    dwBufferLength:= bufsize;
    dwBytesRecorded:= 0;
    dwUser:= 0;
    dwLoops:= 1;
  end;
  bufsize:= waveformat.nAvgBytesPerSec*2 div 16;
  waveInOpen(@Wavein,WAVE_MAPPER,addr(waveformat),self.Handle,0,CALLBACK_WINDOW);
  waveOutOpen(@WaveOut, WAVE_MAPPER, @WaveFormatOut, self.Handle, 0, CALLBACK_WINDOW);
  GetMem(WaveHdr1.lpData, bufsize);
  WaveHdr.lpData:=Pchar(GlobalAlloc(GMEM_FIXED, bufsize));
  WaveHdr.dwBufferLength:=bufsize;
  WaveHdr.dwFlags:=0;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  waveInPrepareHeader(wavein,@WaveHdr,sizeof(Twavehdr));
  waveInAddBuffer(wavein,@WaveHdr,sizeof(TwaveHdr));
  waveinStart(wavein);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  waveInUnprepareHeader(Wavein,@WaveHdr,sizeof(TwaveHdr));
  waveInStop(Wavein);
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  waveInClose(Wavein);
end;
 
procedure TForm1.playson(p: PansiChar);
begin
  WaveHdr1:=WaveHdr;
  waveOutPrepareHeader(WaveOut,@WaveHdr1,sizeof(TWaveHdr));
  waveOutWrite(WaveOut,@WaveHdr1,sizeof(TWaveHdr));
end;
 
end.
Все делал как там только использовал не 8, а 1 буфер. Я думаю это ничего не меняет. Тем более там обьяснили такое решение удобством. Мне удобно использовать 1 буфер. Пример выше не работает. Хотяя должно...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2017, 18:16
Ответы с готовыми решениями:

Захват звука с микрофона и воспроизведение
Здравствуйте! Подскажите чем можно брать звук с микрофона, чтоб можно было его передавать по сети и...

Захват звука с микрофона
Подскажите пожалуйста с помощью каких библиотек и каких их функций можно захватить звук с...

Захват звука с микрофона
Нужно считать звук с двух микрофонов и возможность выбирать микрофон для считывания. ...

Захват звука с микрофона
Какие существуют средства в HTML5 для захвата звука с микрофона, сохранения и последующей его...

2
4429 / 3672 / 1236
Регистрация: 14.04.2014
Сообщений: 17,149
Записей в блоге: 17
19.05.2017, 21:12 2
еще раз повторю
берем библиотеку BASS.DLL
там рабочий пример Delphi\RecordTest
0
-4 / 0 / 0
Регистрация: 13.11.2015
Сообщений: 488
21.05.2017, 03:18  [ТС] 3
библиотека BASS.DLL будет работать хорошо и на всех компах?

Добавлено через 3 часа 4 минуты
аа это надо будет таскать длл-ку с собой. ппц.

Добавлено через 39 минут
Реализовать захват у меня получилось. А вот воспроизведение не в какую. У меня захваченный звук хранится в WaveHdr.lpData. в формате Pansichar. Мне всего нужно его воспроизвести. Можно обойтись без bass

Добавлено через 4 часа 23 минуты
???

Добавлено через 9 часов 5 минут
неужели никто не сталкивался с такой проблемой?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.05.2017, 03:18

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Захват видео с экрана с записью звука с микрофона
Добрый день. Требуется средствами C# 3.5 записать видео со звуком. Изображение - это состояние...

Захват звука с микрофона без графической оболочки
Добрый день, дамы и господа. Сразу скажу, что в C# я нуб полнейший, на уровне чайника писал...

Захват и сохранение звука с микрофона в реальном времени
Если есть готовое решение - дайте ссылку где посмотреть. Нужно следующее: Программа слушает...

Воспроизведение звука с микрофона
Всем привет! Какую библиотечку использовать, чтобы воспроизводить звук с микрофона? Я бы хотел...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.