• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Захват Звука С Микрофона И Определение Дб

A Оффлайн

azm_ezm_ivan

Принятый Кодер
Регистрация
12 Сен 2016
Сообщения
9
Баллы
30
Помогите....!! кто-нибудь пробовал захватиить звук реалтайм с микрофона и определить громкость ?
 
Sascha Оффлайн

Sascha

Заместитель Администратора
Команда форума
Администратор
Регистрация
9 Май 2015
Сообщения
1,227
Баллы
155
Если можно то код самого захвата или программы
 
Lomanu4 Оффлайн

Lomanu4

Команда форума
Администратор
Регистрация
1 Мар 2015
Сообщения
1,481
Баллы
155
Помогите....!! кто-нибудь пробовал захватиить звук реалтайм с микрофона и определить громкость ?
Минимальный код на Bass, считывание с микрофона звук и сразу его воспроизведение.
При желании можно запись в файл, ловить буфер в RecordingCallback и объявить заголовок затем записывать через tmemorystream затем сохранять в файл, а можно и сразу в файл.
Код:
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.
 
A Оффлайн

azm_ezm_ivan

Принятый Кодер
Регистрация
12 Сен 2016
Сообщения
9
Баллы
30
Извиняюсь....не уточнил)) микрофон в телефоне (андроид). Наслышан что БАСС не прокатит? Не могу найти как определить дб... ведь куча прог на андройде по определению громкости... должно просто реализовать. .. но как это просто отыскать?
 
Lomanu4 Оффлайн

Lomanu4

Команда форума
Администратор
Регистрация
1 Мар 2015
Сообщения
1,481
Баллы
155
Одно дело наслышан другое попробовать,есть bass для firemonkey
 
A Оффлайн

azm_ezm_ivan

Принятый Кодер
Регистрация
12 Сен 2016
Сообщения
9
Баллы
30
как записать звук с микрофона понятно....как узнать вывести громкость на хотя бы прогресс бар?
 
Sascha Оффлайн

Sascha

Заместитель Администратора
Команда форума
Администратор
Регистрация
9 Май 2015
Сообщения
1,227
Баллы
155
A Оффлайн

azm_ezm_ivan

Принятый Кодер
Регистрация
12 Сен 2016
Сообщения
9
Баллы
30
спасибо....но все оказалось проще (как я и думалbomj)


procedure TForm3.Button1Click(Sender: TObject);
begin
FAudioRec := TJMediaRecorder.Create;
FAudioRec.setAudioSource(TJMediaRecorder_AudioSource.JavaClass.MIC);
FAudioRec.setOutputFormat(TJMediaRecorder_OutputFormat.JavaClass.THREE_GPP);
FAudioRec.setAudioEncoder(TJMediaRecorder_AudioEncoder.JavaClass.AMR_NB);
FAudioRec.setOutputFile(StringToJString(TPath.Combine(TPath.GetSharedMusicPath, 'myrecord.3gp')));
try
FAudioRec.Prepare();
FAudioRec.start;
except
on E: Exception do
ShowMessage('не могу записать !');
end;
Timer1.Enabled:=true;
end;

procedure TForm3.Button2Click(Sender: TObject);
begin
FAudioRec.stop;
FAudioRec.release;
end;

procedure TForm3.Timer1Timer(Sender: TObject);
begin
Label1.Text:= IntToStr(FAudioRec.getMaxAmplitude);
end;
flowers
 
A Оффлайн

azm_ezm_ivan

Принятый Кодер
Регистрация
12 Сен 2016
Сообщения
9
Баллы
30
Долго ковырялся с AndroidAPI....не мог понять почему не функциклирует, оказалось нужно было просто создать объект )))) FAudioRec := TJMediaRecorder.Create;lach
 
A Оффлайн

azm_ezm_ivan

Принятый Кодер
Регистрация
12 Сен 2016
Сообщения
9
Баллы
30
ну а дБ уже можно и по формулам посчитать
 
Вверх Снизу