Abrufen der AVI-Dateidauer
Ich verwende ein VFW-Gerät von JEDI-Wrapper auf WinAPI.
Der Code, den ich schreibe, dient zum Durchsuchen von Benutzerlaufwerken und zum Erkennen von Warez (Hinweis: Die Entscheidung, ob eine Datei legal ist oder nicht, ist nicht Gegenstand dieser Frage). Wir führen MP3-, WMA- und einige Grafikdateisuchen durch. Jetzt wollen wir illegale Filme entdecken. Ich möchte die AVI-Datei öffnen, einige Details lesen und sie schließen. Ich habe folgenden Code:
uses WFV; //from JEDI api wrappers
procedure TForm1.Button1Click(Sender: TObject);
var
lInfo : TAVIFILEINFOW;
lFile : IAVIFILE;
lFileType : string;
lLenMinutes : integer;
lFPS : integer;
begin
{init file}
AVIFileInit;
try
{Open file - note: since we search for warez this is perfely "warezy" file}
AVIFileOpen(lFile, 'e:\Sideways KLAXXON\Sideways KLAXXON.avi', OF_READ, nil);
try
{Get file info}
AVIFileInfoW(lFile, lInfo, sizeof(lInfo));
lFPS:=Round(lInfo.dwRate /lInfo.dwScale);
lLenMinutes := Round(lInfo.dwLength / lFPS / 60);
lFileType := lInfo.szFileType;
{just for show: prepare some memo to see what we get}
memo1.Lines.Clear;
memo1.Lines.Add('File lenght [min]: ' + IntToStr(lLenMinutes));
memo1.Lines.Add('Width: ' + IntToStr(lInfo.dwWidth));
memo1.Lines.Add('Height: ' + IntToStr(lInfo.dwHeight));
memo1.Lines.Add('File type: ' + lFileType);
finally
{Closing the file}
AVIFileRelease (lFile);
Pointer(lFile) := nil;
end;
finally
{Releasing library}
AVIFileExit;
end;
end;
LLenMinutes entspricht also 98, während der Film ungefähr 121 Minuten lang ist. Das ist ein großer Unterschied. Was mache ich falsch? dwRate ist 1 Million und dwScale ist 40.000, die FPS ist also perfekt 25. dwLength ist 147.000MSDN sagt: "Die Einheiten werden durch dwRate und dwScale definiert".
Hinweis: Dies ist einFollow-up von dieser Frage, aber da das Absturzproblem behoben ist, habe ich die andere Frage geschlossen und den verbesserten Inhalt hierher verschoben.