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 = 'Info' then
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.