Thema: Delphi WAV-Dateien und ID3Tag?

Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#14

Re: WAV-Dateien und ID3Tag?

  Alt 13. Aug 2007, 15:41
Zitat von Martin K:
aber wie man damit die Position des INFO Chunk oder ähnliches erhalten soll?!?
Das kannst Du dem Link zum Wiki-Eintrag entnehmen. Eine Wave-Datei hat einen recht einfachen Aufbau, Du hast einen Header "RIFF"<Größe der Datei>"WAVE", dem folgen dann die Chunks in der Form <ChunkID><Größe><Daten>. ChunkID ist dabei genau wie die Größe immer exakt 4 Byte groß. Während Du die ID also einfach in einen String der Länge 4 einlesen kannst, kannst Du die Größe in ein Cardinal einlesen.
Entsprechend kannst Du die Wave-Datei auf vorhandene INFO-Chunks prüfen, ungetestet ungefähr so:

Delphi-Quellcode:
function hasInfoChunk(const file: TStream): Boolean;
var ChunkId: String;
    count: Cardinal;
begin
  result := false;
  setLength(ChunkId, 4);

  // Prüfen ob Datei größer als Header (12 Byte) und erstes Chunk (mind. 8 Byte)
  if (file.size >= 20) then
  begin
    while (file.Position + 8 < file.Size) and (not result) do
    begin
      file.Position := 16;
      file.Read(ChunkId, 4);
      file.Read(count, 4);
  
      // prüfen ob das gelesene Chunk ein Info-Chunk ist
      if ChunkId = 'Infothen
      begin
        result := true;
      end
      else
      begin
        file.Position := file.Position + count;
      end;
    end;
  end;
end;
So ganz grob sollte das klappen. Natürlich ist auch hier das lesen von 2x4 Zeichen nicht wirklich effizient, nur werden mehr Zeichen nicht betrachtet. Besser wäre es sicherlich trotzdem einen Puffer von 8 Byte zu verwenden und die Daten dann in die Variablen zu kopieren, aber das ist eine andere Sache. Hier greift (hoffentlich) die Compileroptimierung und passt das gleich sinnvoll an.

Jedenfalls kannst Du auf die gleiche Art auch den Offset zu dem entsprechenden Chunk zurückgeben lassen, das wäre eben File.Position - 8 (da Du ja mit ChunkId und Count schon weiter gelaufen bist) und könntest so auch gleich das ganze Chunk entfernen (alles bis dorthin und alles dahinter - count sagt Dir ja wie groß das Chunk ist - abschneiden/rauskopieren, Du weißt schon.
  Mit Zitat antworten Zitat