0

我在 WinAPI 上使用 JEDI 包装器中的 VFW 单元。

我正在编写的代码旨在搜索用户驱动器并检测warez(注意:确定某些文件是否合法超出了此问题的范围)。我们进行 MP3、WMA 和一些图形文件搜索。现在我们要检测非法电影。我想打开 AVI 文件,从中读取一些详细信息并关闭它。我有以下代码:

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 等于 98,而电影的长度约为 121 分钟。这是一个巨大的差异。我究竟做错了什么?dwRate 是 100 万,dwScale 是 40k,所以 FPS 是完美的 25。dwLength 是 147k MSDN 说:“单位由 dwRate 和 dwScale 定义”。

注意:这是这个问题的后续,但是由于崩溃问题已经解决,我关闭了另一个问题并将改进的内容移到这里。

4

1 回答 1

2

MSDN 对dwScale成员说AVIFILEINFO

任何流都可以定义自己的时间尺度来取代文件时间尺度。

你确定流不会覆盖AVIFILEINFO结构中给出的速率和比例吗?流的速率和比例存储在AVISTREAMINFO结构中。

于 2009-11-20T13:02:52.950 回答