Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
Delphi XE2 Architect
|
Re: Länge eines Mediafiles bestimmen
9. Jun 2005, 23:19
Hi
Es ist nicht so einfach wie du dir das vorstellst! Soviel ich weis stehen alle Informationen in der Datei gespeichert. Ich habe den unten stehenden Code benutzt um die Bitrate von Flac files auszulesen. Du kannst den auch benutzen um die Spiellänge auszulesen. (FDuration)
Delphi-Quellcode:
interface
uses
Windows, …..;
// FLAC Info
type
TFlacHeader = record
StreamMarker: array[1..4] of Char; //should always be 'fLaC'
MetaDataBlockHeader: array[1..4] of Byte;
Info: array[1..18] of Byte;
end;
function TAudioEngine.Get_FLAC_Bitrate: WORD;
var fpos : DWORD;
fHandle : integer;
FileFS : THandleStream;
FFileLength : integer;
FSampleRate : integer;
FSamples : Int64;
FDuration : double;
begin
fHandle := CreateFile(PChar(Cur_FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE,0);
if fHandle = INVALID_HANDLE_VALUE then
exit;
FileFS := THandleStream.Create(fHandle);
FFileLength:= FileFS.Size;
FillChar(FHeader, SizeOf(FHeader), 0);
FileFS.Read(FHeader, SizeOf(FHeader));
fpos:= FileFS.Position;
FileFS.Free;
CloseHandle(fHandle);
// Process data if loaded and header valid
if FHeader.StreamMarker = 'fLaC' then
begin
with FHeader do
begin
FSampleRate:= (Info[11] shl 12 or
Info[12] shl 4 or
Info[13] shr 4);
FSamples := (Info[15] shl 24 or
Info[16] shl 16 or
Info[17] shl 8 or
Info[18]);
FDuration:= FSamples / FSampleRate;
end;
result := Round(((FFileLength - fpos) / 1000) * 8 /FDuration);
end
else
result:= 0;
end;
|
|
Zitat
|