AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi WAV-Datei: Header auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

WAV-Datei: Header auslesen

Ein Thema von Carsten1234 · begonnen am 11. Mär 2009 · letzter Beitrag vom 11. Mär 2009
Antwort Antwort
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#1

WAV-Datei: Header auslesen

  Alt 11. Mär 2009, 10:09
Hallo zusammen,

bevor ich das Rad zum x-Mal neu erfinde (meine Suche hatte bislang leider nix ergeben ):
Ich möchte den Header eine WAV-Datei auslesen, um sie zu prüfen (Mono/Stereo, Samplerate usw.). Die Delphi-Unit MMSystem ist mir bekannt, nur werde ich von der irgendwie erschlagen, auch brachte mich das oder das noch nicht richtig weiter mangels Verständnis.
Frage: Wie lautet der Aufbau (record) einer WAV-Datei und/oder wie kann ich sie gezielt analysieren?

Dank vorab und Gruß, Carsten
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

Re: WAV-Datei: Header auslesen

  Alt 11. Mär 2009, 10:32
Hallo,

schau mal bitte http://www.delphi-fundgrube.de/faq13.htm und dort suchst Du dann nach Töne als Wave-Dateien generieren und über die Soundkarte ausgeben.
Dort findest Du den Quelltext zum Schreiben einer Wave-Datei. Wenn Du die Schreibroutine in eine Leseroutine umwandelst, solltest Du dem gewünschten Ziel deutlich näher kommen.

Eventuell hilft Dir auch http://sox.sourceforge.net/AudioFormats-11.html weiter, dort bitte nach WAVe file format (Microsoft) suchen. Es dürfte ausreichen, wenn Du Dir einen Record entsprechend der dort beschriebenen Definition erstellst und den dann aus der Datei liest. Damit müsstest Du alle Infos bekommen.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

Re: WAV-Datei: Header auslesen

  Alt 11. Mär 2009, 11:38
Hallo CARSTEN1234

vielleicht hilft Dir das hier:
Delphi-Quellcode:
type
  { prototyp für einen chunk in einer RIFF-Datei: }
  T_chunkproto=packed record
                 name:array[0..3] of char;
                 lang:integer;
               end;
  T_RIFF_HEAD=packed record
                name : Array [0..3] of char;
                lange: integer;
                name0: array[0..3] of char; { 'WAVE'  }
              end;
  T_WAVE_FMThead=packed record
               name : array[0..3] of char; {'fmt ' }
               lang : integer; {4Byte }
               ST_M : word; {2Byte  - ST=1 Mono=0 }
               Kanalanz : word; {2Byte }
               SamplRate: integer; {4Byte }
               Byte_sec : integer; {4Byte }
               Byte_sample:word; {2Byte 1=8BMono; 2=8B St oder 16B Mono; 4=16B Stereo }
               Bits_sample:word; {2Byte }
             end;
  T_fact_head=packed record
               name : array[0..3] of char; { 'fact' }
               lang : integer; {4Byte }
               {daten.....lang Byte}
             end;
  t_data_head=packed record
               name : array[0..3] of char; { 'data ' }
               lang : integer; {4Byte }
               {Daten....Lang Byte }
             end;
var
  riff_head: T_RIFF_HEAD;
  wav_head : t_wave_fmthead;
  data16ST : array of word;
  data16MO : array of word;
  data8ST : array of byte;
  data8MO : array of byte;
  pre_data : integer; { Anzahl Daten vor dem Data-Chunk }

function READ_HEADER(efile:string):boolean;
procedure READ_DATA(efile:string;cv:tcanvas;labl:tlabel);
function GET_PRE_DATA(efile:string):integer;

implementation

function GET_PRE_DATA(efile:string):integer;
var
  edat : file;
  buffer : array [0..$FFFF] of byte;
  tb : t_chunkproto absolute buffer;
  lies : integer;
  gelesen : integer;
  ende : boolean;
begin
  result:=0;
  assignfile(edat,efile);
  reset(edat,1);
  blockread(edat,buffer,sizeof(riff_head),gelesen); { RIFF-Header lesen}
  repeat
    blockread(edat,buffer,8,gelesen); { 4 char+ 4Byte länge}
    if tb.name<>'datathen begin
      lies:=tb.lang;
      seek(edat,filepos(edat)+lies);
    end
    else begin
      lies:=0;
      result:=filepos(edat)-8;
    end;
  until eof(edat) or (tb.name='data');
  closefile(edat);
end;{-- GET_PRE_DATA -----------------------------------------------------}

function READ_HEADER(efile:string):boolean;
var
  edat : file;
  buffer : array [0..$FFFF] of byte;
  gelesen : integer;
begin
  result:=false;
  assignfile(edat,efile);
  reset(edat,1);
  blockread(edat,buffer,sizeof(riff_head),gelesen);
  move(buffer[0],riff_head,sizeof(riff_head));
  if (riff_head.name='RIFF') and (riff_head.name0='WAVE') then begin
    result:=true;
    blockread(edat,buffer,sizeof(wav_head),gelesen);
    move(buffer[0],wav_head,sizeof(wav_head));
  end;
  closefile(edat);
end;
Gruß
K-H
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#4

Re: WAV-Datei: Header auslesen

  Alt 11. Mär 2009, 13:34
Eine Wave Datei baut sich folgendermaßen auf:

4 Byte 'RIFF'
4 Byte Die Dateigröße als DWord-8 Bytes
8 Byte 'WAVEfmt '
4 Byte Die größe von TWaveFormatEx (Für PCM -2 Bytes, da das Member cbSize nicht mitgespeichert wird!) *
X Byte TWaveFormatEx (Für PCM die letzten -2 Bytes abschneiden)
X Byte Platz für zusätzliche Daten *
4 Byte 'data'
4 Byte Die größe der Sound Daten (meistens Dateigröße-Headergröße)
X Byte Wave Daten

* Je nach Audiocompressor können zusätzliche Daten angehängt werden.
Es ist aber auch möglich, das man dort "private" Daten abspeichert, wie in dem Beispiel im Angang zu sehen ist
Angehängte Dateien
Dateityp: zip test.wav_119.zip (529 Bytes, 72x aufgerufen)
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#5

Re: WAV-Datei: Header auslesen

  Alt 11. Mär 2009, 13:45
Danke für die zahlreichen Antworten, Problem ist gelöst.

Gruß, Carsten
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:07 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