Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Получить информацию о WAV файле

Delphi , Мультимедиа , Аудио

Получить информацию о WAV файле


unit W32Waves; 
{ Unit for accessing Windows PCM wave file informations 
  By Ulli Conrad <uconrad@gmx.net> } 

interface 

uses SysUtils, Windows, MMSystem, Dialogs; 

type 
  PWaveInformation = ^tWaveInformation; 
  TWaveInformation = record 
    WaveFormat: Word;         { Wave format identifier } 
    Channels: Word;         { Mono=1, Stereo=2 } 
    SampleRate: Longint;      { Sample rate in Hertz } 
    BitsPerSample: Word;         { Resolution, e.g. 8 or 16 Bit } 
    SamplesNumber: Longint;      { Number of samples } 
    Length: Extended;     { Sample length in seconds } 
    ValidWave: bool;         { Specifies if the file could be read } 
  end; 

const                            { Constants for wave format identifier } 
  WAVE_FORMAT_PCM = $0001;   { Windows PCM } 
  WAVE_FORMAT_G723_ADPCM = $0014;   { Antex ADPCM } 
  WAVE_FORMAT_ANTEX_ADPCME = $0033;   { Antex ADPCME } 
  WAVE_FORMAT_G721_ADPCM = $0040;   { Antex ADPCM } 
  WAVE_FORMAT_APTX = $0025;   { Audio Processing Technology } 
  WAVE_FORMAT_AUDIOFILE_AF36 = $0024;   { Audiofile, Inc. } 
  WAVE_FORMAT_AUDIOFILE_AF10 = $0026;   { Audiofile, Inc. } 
  WAVE_FORMAT_CONTROL_RES_VQLPC = $0034;   { Control Resources Limited } 
  WAVE_FORMAT_CONTROL_RES_CR10 = $0037;   { Control Resources Limited } 
  WAVE_FORMAT_CREATIVE_ADPCM = $0200;   { Creative ADPCM } 
  WAVE_FORMAT_DOLBY_AC2 = $0030;   { Dolby Laboratories } 
  WAVE_FORMAT_DSPGROUP_TRUESPEECH = $0022;   { DSP Group, Inc } 
  WAVE_FORMAT_DIGISTD = $0015;   { DSP Solutions, Inc. } 
  WAVE_FORMAT_DIGIFIX = $0016;   { DSP Solutions, Inc. } 
  WAVE_FORMAT_DIGIREAL = $0035;   { DSP Solutions, Inc. } 
  WAVE_FORMAT_DIGIADPCM = $0036;   { DSP Solutions ADPCM } 
  WAVE_FORMAT_ECHOSC1 = $0023;   { Echo Speech Corporation } 
  WAVE_FORMAT_FM_TOWNS_SND = $0300;   { Fujitsu Corp. } 
  WAVE_FORMAT_IBM_CVSD = $0005;   { IBM Corporation } 
  WAVE_FORMAT_OLIGSM = $1000;   { Ing C. Olivetti & C., S.p.A. } 
  WAVE_FORMAT_OLIADPCM = $1001;   { Ing C. Olivetti & C., S.p.A. } 
  WAVE_FORMAT_OLICELP = $1002;   { Ing C. Olivetti & C., S.p.A. } 
  WAVE_FORMAT_OLISBC = $1003;   { Ing C. Olivetti & C., S.p.A. } 
  WAVE_FORMAT_OLIOPR = $1004;   { Ing C. Olivetti & C., S.p.A. } 
  WAVE_FORMAT_IMA_ADPCM = $0011;   { Intel ADPCM } 
  WAVE_FORMAT_DVI_ADPCM = $0011;   { Intel ADPCM } 
  WAVE_FORMAT_UNKNOWN = $0000; 
  WAVE_FORMAT_ADPCM = $0002;   { Microsoft ADPCM } 
  WAVE_FORMAT_ALAW = $0006;   { Microsoft Corporation } 
  WAVE_FORMAT_MULAW = $0007;   { Microsoft Corporation } 
  WAVE_FORMAT_GSM610 = $0031;   { Microsoft Corporation } 
  WAVE_FORMAT_MPEG = $0050;   { Microsoft Corporation } 
  WAVE_FORMAT_NMS_VBXADPCM = $0038;   { Natural MicroSystems ADPCM } 
  WAVE_FORMAT_OKI_ADPCM = $0010;   { OKI ADPCM } 
  WAVE_FORMAT_SIERRA_ADPCM = $0013;   { Sierra ADPCM } 
  WAVE_FORMAT_SONARC = $0021;   { Speech Compression } 
  WAVE_FORMAT_MEDIASPACE_ADPCM = $0012;   { Videologic ADPCM } 
  WAVE_FORMAT_YAMAHA_ADPCM = $0020;   { Yamaha ADPCM } 

function GetWaveInformationFromFile(FileName: string; Info: pWaveInformation): bool; 

implementation 

type 
  TCommWaveFmtHeader = record 
    wFormatTag: Word;                  { Fixed, must be 1 } 
    nChannels: Word;                  { Mono=1, Stereo=2 } 
    nSamplesPerSec: Longint;               { SampleRate in Hertz } 
    nAvgBytesPerSec: Longint; 
    nBlockAlign: Word; 
    nBitsPerSample: Word;                  { Resolution, e.g. 8 or 16 } 
    cbSize: Longint;               { Size of extra information in the extended fmt Header } 
  end; 

function GetWaveInformationFromFile(FileName: string; Info: pWaveInformation): bool; 
var 
  hdmmio: HMMIO; 
  mmckinfoParent: TMMCKInfo; 
  mmckinfoSubchunk: TMMCKInfo; 
  Fmt: TCommWaveFmtHeader; 
  Samples: Longint; 
begin 
  Result := False; 
  FillChar(Info^, SizeOf(TWaveInformation), #0); { Initialize first } 
  hdmmio := mmioOpen(PChar(FileName), nil, MMIO_READ); 
  if (hdmmio = 0) then 
    Exit; 
      {* Locate a 'RIFF' chunk with a 'WAVE' form type 
       * to make sure it's a WAVE file. 
       *} 
  mmckinfoParent.fccType := mmioStringToFOURCC('WAVE', MMIO_TOUPPER); 
  if (mmioDescend(hdmmio, PMMCKINFO(@mmckinfoParent), nil, MMIO_FINDRIFF) <> 0) then 
    Exit; 
      {* Now, find the format chunk (form type 'fmt '). It should be 
       * a subchunk of the 'RIFF' parent chunk. 
       *} 
  mmckinfoSubchunk.ckid := mmioStringToFOURCC('fmt ', 0); 
  if (mmioDescend(hdmmio, @mmckinfoSubchunk, @mmckinfoParent, MMIO_FINDCHUNK) <> 0) then 
    Exit; 

  // Read the format chunk. 
  if (mmioRead(hdmmio, PChar(@fmt), Longint(SizeOf(TCommWaveFmtHeader))) <> 
    Longint(SizeOf(TCommWaveFmtHeader))) then 
    Exit; 
  Info^.WaveFormat    := fmt.wFormatTag; 
  Info^.Channels      := fmt.nChannels; 
  Info^.SampleRate    := fmt.nSamplesPerSec; 
  Info^.BitsPerSample := fmt.nBitsPerSample; 
  mmioAscend(hdmmio, @mmckinfoSubchunk, 0); // Ascend out of the format subchunk. 
  mmckinfoSubchunk.ckid := mmioStringToFOURCC('data', 0); // Find the data subchunk. 
  if (mmioDescend(hdmmio, @mmckinfoSubchunk, @mmckinfoParent, MMIO_FINDCHUNK) <> 0) then 
    Exit; 
  Info^.SamplesNumber := mmckinfoSubchunk.cksize; // Get the size of the data subchunk. 

  Samples      := (Info^.SamplesNumber * 8 * Info^.Channels) div Info^.BitsPerSample; 
  Info^.Length := Samples / Info^.Samplerate; 
  mmioClose(hdmmio, 0); // We're done with the file, close it. 
  Info^.ValidWave := True; 
  Result          := True; 
end; 
end.

Программный модуль Delphi под именем W32Waves предназначен для доступа к информации о файле Windows PCM-волны (WAV). В этом разделе кода:

  1. Модуль определяет тип записи TWaveInformation, который содержит различные свойства файла WAV, такие как:
    • WaveFormat: целочисленное значение, указывающее идентификатор формата волны
    • Channels: целочисленное значение, указывающее количество каналов (моно/стерео)
    • SampleRate: длинное целочисленное значение, представляющее частоту дискретизации в герцах
    • BitsPerSample: целочисленное значение, представляющее разрешение (например, 8 или 16 бит)
    • SamplesNumber: длинное целочисленное значение, представляющее количество образцов
    • Length: расширенное значение, представляющее длину образца в секундах
    • ValidWave: булевое значение, указывающее, была ли успешно прочитана файл
  2. Модуль определяет несколько констант для идентификаторов форматов волны, включая PCM, ADPCM и другие.
  3. Функция GetWaveInformationFromFile принимает два параметра:
    • FileName: строка, представляющая путь к файлу WAV
    • Info: указатель на запись TWaveInformation, которая будет заполнена информацией о файле WAV
  4. Функция инициализирует пустую запись TWaveInformation с помощью процедуры FillChar.
  5. Затем она открывает указанный файл WAV с помощью функции mmioOpen и проверяет, является ли файл валидным.
  6. Если файл валиден, она находит чанк 'RIFF' с формой типа 'WAVE' для подтверждения, что это файл WAV.
  7. Далее она находит чанк формата ('fmt ') внутри чанка 'RIFF' с помощью функции mmioDescend.
  8. Она читает данные чанка формата в запись TCommWaveFmtHeader с помощью функции mmioRead.
  9. Функция заполняет запись TWaveInformation значениями из чанка формата:
    • WaveFormat: идентификатор формата волны
    • Channels: количество каналов (моно/стерео)
    • SampleRate: частота дискретизации в герцах
    • BitsPerSample: разрешение (например, 8 или 16 бит)
  10. Функция находит и читает подчанк данных внутри чанка 'RIFF' с помощью функции mmioDescend.
  11. Она рассчитывает количество образцов на основе частоты дискретизации, количества каналов и разрешения.
  12. Наконец, она закрывает файл с помощью функции mmioClose и устанавливает ValidWave в True.
  13. Функция возвращает булевое значение, указывающее, был ли успешно прочитан файл WAV.

В целом, этот модуль обеспечивает доступ к информации о файлах WAV в программах Delphi.

Получение информации о формате WAV-файла.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Аудио ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 02:22:44/0.003633975982666/0