|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Как записать звук с микрофона в wav файл
Приветствую форумчани!
Возникла проблема =( Решил добавить в свой проект печаталку текста через микрофон. Но никак не получается записать звук и отсейвить это в wav(ик). Нужен примерчик именно для VCL =( для FMX много разных. Но весь огромный проект на VCL так что без вариантов. Я пробовал использовать HWaveIn и TMemoryStream/TFileStream. Поглядите может вы поймёте в чём дело: Код:
var WaveIn: HWaveIn; WaveFormat: TWaveFormatEx; WaveHeader: TWaveHdr; Buffer: array[0..1023] of Byte; FileStream: TFileStream; // старт записи procedure TForm1.Button1Click(Sender: TObject); begin WaveFormat.wFormatTag := WAVE_FORMAT_PCM; WaveFormat.nChannels := 1; WaveFormat.nSamplesPerSec := 44100; WaveFormat.nAvgBytesPerSec := WaveFormat.nSamplesPerSec * WaveFormat.nChannels * 2; WaveFormat.nBlockAlign := 2; WaveFormat.wBitsPerSample := 16; WaveFormat.cbSize := 0; WaveInOpen(@WaveIn, WAVE_MAPPER, @WaveFormat, 0, 0, 0); WaveInStart(WaveIn); WaveInPrepareHeader(WaveIn, @WaveHeader, SizeOf(WaveHeader)); WaveInAddBuffer(WaveIn, @WaveHeader, SizeOf(WaveHeader)); end; procedure TForm1.Button2Click(Sender: TObject); begin FileStream := TFileStream.Create('c:\wav\sound.wav', fmCreate); try WaveInUnprepareHeader(WaveIn, @WaveHeader, SizeOf(WaveHeader)); WaveInStop(WaveIn); WaveInClose(WaveIn); FileStream.WriteBuffer(WaveFormat, SizeOf(WaveFormat)); FileStream.WriteBuffer(WaveHeader.lpData^, WaveHeader.dwBufferLength); ShowMessage('Звук успешно сохранен!'); finally FileStream.Free; end; end; Кстати очень удивило что нет ни одного рабочего примера в интернете. Вроде ведь часто кому может потребоваться. TMediaPlayer тоже не сейвит у меня звуки почему-то =( так как везде примеры с MediaPlayer1.DeviceType := dtAudioIn; или MediaPlayer1.DeviceType := dMicrophone; а в моей дельфи 2020года есть только dtWaveAudio который почему то не хочет писать и сейвить вавики =( пОмОхИте чем сможите)) Спасибо |
#2
|
|||
|
|||
Так тоже не работает =(
Код:
var WaveIn: HWAVEIN; WaveHeader: PWAVEHDR; Stream: TMemoryStream; WaveFormat: TWaveFormatEx; //start button WaveIn := 0; WaveHeader := nil; Stream := TMemoryStream.Create; // инициализация записи WaveFormat.wFormatTag := WAVE_FORMAT_PCM; WaveFormat.nChannels := 1; WaveFormat.nSamplesPerSec := 44100; WaveFormat.wBitsPerSample := 16; WaveFormat.nBlockAlign := WaveFormat.nChannels * (WaveFormat.wBitsPerSample div 8); WaveFormat.nAvgBytesPerSec := WaveFormat.nSamplesPerSec * WaveFormat.nBlockAlign; WaveFormat.cbSize := 0; waveInOpen(@WaveIn, WAVE_MAPPER, @WaveFormat, 0, 0, WAVE_FORMAT_DIRECT); // выделение памяти под буфер GetMem(WaveHeader, SizeOf(WAVEHDR)); WaveHeader^.lpData := AllocMem(8192); WaveHeader^.dwBufferLength := 8192; WaveHeader^.dwBytesRecorded := 0; WaveHeader^.dwUser := 0; WaveHeader^.dwFlags := 0; WaveHeader^.dwLoops := 0; WaveHeader^.lpNext := nil; WaveHeader^.reserved := 0; // запись звука waveInPrepareHeader(WaveIn, WaveHeader, SizeOf(WAVEHDR)); waveInAddBuffer(WaveIn, WaveHeader, SizeOf(WAVEHDR)); waveInStart(WaveIn); //stop button waveInStop(WaveIn); waveInUnprepareHeader(WaveIn, WaveHeader, SizeOf(WAVEHDR)); Stream.Write(WaveHeader^.lpData^, WaveHeader^.dwBytesRecorded); Stream.SaveToFile('sound.wav'); FreeMem(WaveHeader^.lpData); FreeMem(WaveHeader); waveInClose(WaveIn); Stream.Free; Последний раз редактировалось Trogov, 21.10.2023 в 11:36. |
#3
|
|||
|
|||
Забыл сказать что касперски спрашивает можно ли делать запись с мика и я ему разрешаю... но ничего.. =(
есть ещё такой пример Код:
uses HWaveIn, WaveIO; var WaveIn: THWaveIn; WaveFile: TWaveFile; WaveFormat: TWaveFormatEx; Buffer: Pointer; BufferSize: Cardinal; begin // Создаем и настраиваем компонент HWaveIn WaveIn := THWaveIn.Create(nil); WaveIn.DeviceID := 0; // Используем первое устройство записи WaveIn.WaveFormat.FormatTag := WAVE_FORMAT_PCM; WaveIn.WaveFormat.Channels := 1; WaveIn.WaveFormat.SamplesPerSec := 48000; WaveIn.WaveFormat.BitsPerSample := 16; WaveIn.WaveFormat.BlockAlign := WaveIn.WaveFormat.Channels * (WaveIn.WaveFormat.BitsPerSample div 8); WaveIn.WaveFormat.BytesPerSec := WaveIn.WaveFormat.SamplesPerSec * WaveIn.WaveFormat.BlockAlign; WaveIn.BufferSize := 1024; WaveIn.Open; // Создаем WAV-файл для записи WaveFormat := WaveIn.WaveFormat; WaveFile := TWaveFile.Create('C:\MyRecord.wav', WaveFormat); // Запускаем запись WaveIn.Start; // Записываем данные в файл while WaveIn.GetBuffer(Buffer, BufferSize) = 0 do begin WaveFile.WriteData(Buffer, BufferSize); end; // Останавливаем запись WaveIn.Stop; // Освобождаем ресурсы WaveFile.Free; WaveIn.Free; end. но что за компонент такой TWaveFile; один бог знает... моя система его не видет и в интернете о нём ни слова... |
#4
|
|||
|
|||
Цитата:
|