Spiellänge einer Wav-Datei |
|
| System | Win9x, WinNT, Win2000, WinXP, Vista, Win7 |
|---|---|
| Ab Delphi-Version | Delphi 1 |
| Letzte Änderung | 28.09.2010 |
Diese Funktion ermittelt die Länge eines WAV-Files. Die Funktion kann nur für unkomprimierte Wav-Dateien verwendet werden. Außerdem müssen die Dateien in der gleichen Sample-Rate abgespielt werden, damit der Wert richtig ist.
function GetWaveLength(WaveFile: string): Double;
var
groupID: array[0..3] of char;
riffType: array[0..3] of char;
BytesPerSec: Integer;
Stream: TFileStream;
dataSize: Integer;
// chunk seeking function,
// -1 means: chunk not found
function GotoChunk(ID: string): Integer;
var
chunkID: array[0..3] of char;
chunkSize: Integer;
begin
Result := -1;
with Stream do begin
// index of first chunk
Position := 12;
repeat
// read next chunk
Read(chunkID, 4);
Read(chunkSize, 4);
if chunkID <> ID then
// skip chunk
Position := Position + chunkSize;
until (chunkID = ID) or (Position >= Size);
if chunkID = ID then
// chunk found,
// return chunk size
Result := chunkSize
end
end;
begin
Result := -1;
Stream := TFileStream.Create(WaveFile, fmOpenRead or
fmShareDenyNone);
with Stream do
try
Read(groupID, 4);
Position := Position + 4; // skip four bytes (file size)
Read(riffType, 4);
if (groupID = 'RIFF') and (riffType = 'WAVE') then begin
// search for format chunk
if GotoChunk('fmt ') <> -1 then begin
// found it
Position := Position + 8;
Read(BytesPerSec,4);
// search for data chunk
dataSize := GotoChunk('data');
if dataSize <> -1 then
// found it
Result := dataSize / BytesPerSec
end
end
finally
Free
end
end;
Aufgerufen kann diese Funktion Beispielsweise so:
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption:=FloatToStr(GetWaveLength(Edit1.Text));
end;
In der Titelleiste des Formulars kann man dann die Länge der Wav-Datei ablesen. Die Spieldauer wird in Sekunden angegeben.