A
Оффлайн
azm_ezm_ivan
Принятый Кодер
- Регистрация
- 12 Сен 2016
- Сообщения
- 9
- Баллы
- 30
Помогите....!! кто-нибудь пробовал захватиить звук реалтайм с микрофона и определить громкость ?
Минимальный код на Bass, считывание с микрофона звук и сразу его воспроизведение.Помогите....!! кто-нибудь пробовал захватиить звук реалтайм с микрофона и определить громкость ?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Bass, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
chanPl, ChanMic: Dword;
implementation
{$R *.dfm}
function RecordingCallback(Handle: HRECORD; buffer: Pointer; size, user: DWord):
boolean; stdcall;
begin
BASS_StreamPutData(chanPl, Buffer, size);
BASS_ChannelPlay(chanPl, false);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
if (not BASS_Init(-1, 44100, 0, Handle, nil)) then
begin
BASS_Free();
MessageDlg('Cannot start default device!', mtError, [mbOk], 0);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
BASS_RecordInit(-1);
chanMic:=BASS_RecordStart(8000, 2, BASS_DEVICE_8BITS, @RecordingCallback, nil);
chanPl:= BASS_StreamCreate(8000, 2, BASS_DEVICE_8BITS, STREAMPROC_PUSH, nil);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
BASS_RecordFree;
BASS_StreamFree(chanPL);
BASS_StreamFree(chanMic);
BASS_Free();
end;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Bass, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
chanPlay, ChanMic: Dword;
implementation
{$R *.dfm}
//Функция для записи звука в файл
procedure SaveWav(hChan: HRECORD; FileName: string; Buffer: pointer; Size: Integer);
type
PWaveHeader = ^TWaveHeader;
TWaveHeader = record
idRiff : array [0..3] of Char;
RiffLen : LongInt;
idWave : Array[0..3] of Char;
idFmt : Array[0..3] of Char;
InfoLen : LongInt;
FormatTag : Word;
Channels : Word;
Freq : LongInt;
BytesPerSec : LongInt;
BlockAlign : Word;
BitsPerSample : Word;
idData : Array[0..3] of Char;
DataBytes : LongInt;
end;
var
header: TWaveHeader;
BASS_INFO: BASS_CHANNELINFO ;
f : File;
iSeek: Integer;
begin
if (Buffer <> nil)and(Size > 0) then
begin
FillChar(BASS_INFO, SizeOf(BASS_INFO), 0);
FillChar(header, SizeOf(TWaveHeader), 0);
//Узнаем информацию о канале
BASS_ChannelGetInfo(hChan, BASS_INFO);
{$I-}
AssignFile(f, FileName);
FileMode := fmOpenReadWrite;
Reset(f, 1);
{$I+}
if IOResult > 0 then
rewrite(F, 1)
else
begin
seek(f, 0);
BlockRead(f, header, SizeOf(TWaveHeader));
end;
//выше читаем заголовок для перезаписи и вычисляем размер
with header do
begin
idRiff :='RIFF';
RiffLen := SizeOf(TWaveHeader);
idWave :='WAVE';
idFmt :='fmt ';
InfoLen := 16;
FormatTag := 1;
Channels :=BASS_INFO.chans;
Freq :=BASS_INFO.freq;
BitsPerSample := 8;
BlockAlign := Channels * (BitsPerSample div 8);
BytesPerSec := Freq * BlockAlign;
idData :='data';
DataBytes := DataBytes + Size;
end;
//Запись заголовка
seek(f, 0);
BlockWrite(f, header, SizeOf(TWaveHeader));
//Запись данных в конец файла
iSeek:= filesize(f);
seek(f, iSeek);
BlockWrite(f, Buffer^, Size);
CloseFile(f);
end;
end;
function RecordingCallback(hChan: HRECORD; buffer: Pointer; Size, user: DWord):
boolean; stdcall;
var
pPos, Postime: integer;
begin
//Выводим время это так для примера
pPos:= BASS_ChannelGetPosition(hChan, 0);
if (pPos > 0) then
begin
Postime := Trunc(BASS_ChannelBytes2Seconds(hChan, pPos));
Form1.Caption := (Format(' %d:%.2d', [Postime div 60, Postime mod 60]));
end;
//запись в файл
SaveWav(hChan, 'D:\1111.wav', buffer, Size);
//Воспроизводим звук с микрофона
BASS_StreamPutData(chanPlay, Buffer, Size);
BASS_ChannelPlay(chanPlay, false);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
if (not BASS_Init(-1, 44100, 0, Handle, nil)) then
begin
BASS_Free();
MessageDlg('Cannot start default device!', mtError, [mbOk], 0);
end;
end;
//Запускаем
procedure TForm1.Button1Click(Sender: TObject);
begin
BASS_RecordInit(-1);
chanMic:=BASS_RecordStart(8000, 2, BASS_DEVICE_8BITS, @RecordingCallback, nil);
chanPlay:= BASS_StreamCreate(8000, 2, BASS_DEVICE_8BITS, STREAMPROC_PUSH, nil);
end;
//Останавливаем
procedure TForm1.Button2Click(Sender: TObject);
begin
BASS_RecordFree;
BASS_StreamFree(chanPlay);
BASS_StreamFree(chanMic);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Button2Click(nil);
bass_free;
end;
end.
Может это тебе поможеткак записать звук с микрофона понятно....как узнать вывести громкость на хотя бы прогресс бар?