J'utilise l'unité VFW de l'encapsuleur JEDI sur WinAPI.Obtenir la durée du fichier AVI
Le code que j'écris est destiné à rechercher des lecteurs d'utilisateur et à détecter des warez (note: décider si un fichier est légal ou non dépasse la portée de cette question). Nous faisons MP3, WMA et quelques recherches de fichiers graphiques. Maintenant, nous voulons détecter les films illégaux. Je veux ouvrir le fichier AVI, en lire quelques détails et le fermer. J'ai le code suivant:
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;
Ainsi, les lLenMinutes est quelque chose d'égal à 98 alors que le film est environ 121 minutes. C'est une grande différence. Qu'est-ce que je fais mal? dwRate est 1 million et dwScale est 40k, donc le FPS est parfaitement 25. dwLength est 147k MSDN says: "Les unités sont définies par dwRate et dwScale".
Remarque: il s'agit d'un follow-up from this question, mais comme le problème de plantage a été résolu, j'ai fermé l'autre question et déplacé le contenu amélioré ici.
S'il vous plaît noter que WFV est assez obsolète! – Ampere