Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Einzelne Abtastwerte von WAV auslesen (https://www.delphipraxis.net/101698-einzelne-abtastwerte-von-wav-auslesen.html)

benst 17. Okt 2007 14:40


Einzelne Abtastwerte von WAV auslesen
 
Hallo,

ich würde gerne die einzelnen Abtastwerte einer Wave auslesen.
(Wenn die Wave-Datei eine 44,1kHz Abtastung hat, so habe ich alle 1/44100 = ca. 2,23*10^-5 Sekunden einen Abtastwert.)
Das ganze könnte ich doch relativ einfach" binär auslesen oder? (Wave-Struktur) Oder geht das geschickter?

Gruß
Ben
P.S.: Wie mache ich das am besten bei mp3s (ich würde die mp3 ungerne vorher in WAV umkonvertieren)? Ist ein solches Auslesen mit entsprechenden Bibliotheken einfach?

FAlter 17. Okt 2007 15:32

Re: Einzelne Abtastwerte von WAV auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

das direkt auslesen geht nicht so ohne weiteres, da du nicht weißt, welcher Codec verwendet wurde. Ich habe da mal eine Unit gefunden, in der eine Klasse zum konvertieren in PCM drin ist.

Delphi-Quellcode:
uses
  WaveIO;

type
  TAudioData = array of Smallint;

procedure LoadAudioFile(const FileName: String; var Data: TAudioData; out Format: TWaveFormatEx);
var
  w1: TFileWaveStream;
  pcmw: TPCMWaveReader;
  I, Size: Integer;
  Data2: array of Byte;
begin
  w1 := TFileWaveStream.Create('C:\FileName.wav', nil);
  try
    pcmw := TPCMWaveReader.Create(w1);
    try
      Format := pcmw.Format^;
      case Format.wBitsPerSample of
        8: //nach 16 Bit konvertieren
        begin
          Size := pcmw.Size * Format.nBlockAlign;
          SetLength(Data2, Size);
          SetLength(Data, Integer);

          pcmw.Read(Dat2a[0], pcmw.Size);

         for I := Size - 1 downto 0 do
           Data[I] := (Data2[I] - 128) * (32768 div 128);
        end;
        16:
        begin
          SetLength(Data, pcmw.Size * Format.nBlockAlign div 2);
          pcmw.Read(Data[0], pcmw.Size);        
        end;
      else
        //Exception oder so
      end;
    finally
      pcmw.Free;
    end;
  finally
    w1.Free;
  end;
end;

...

var
  AudioData: TAudioData;
  Format: TWaveFormatEx;
  Sample: Shortint;

...

LoadAudioFile('D:\Test.wav', AudioData, Format);

Sample := AudioData[Trunc(ZeitInSekunden * Format.nSamplesPerSec)];
Ungetestet, nur aus eigenem Code kopiert und dann abgewandelt - keine Garantie auf Lauffähigkeit, insbesondere das 8bit-zu-16bit-Konvertieren.

Auf irgendeiner CD hab ich das komplette WaveIO-Zeugs gesichert. Da wäre dann auch ne Readme dabei. Muss ich aber erst finden.

Mfg
FAlter

Progman 17. Okt 2007 15:41

Re: Einzelne Abtastwerte von WAV auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vielleicht hilft dir das Project im Anhang weiter. Das hab ich auf meiner Festplatte gefunden ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz