代码之家  ›  专栏  ›  技术社区  ›  smok1

获取AVI文件持续时间

  •  0
  • smok1  · 技术社区  · 15 年前

    我正在使用WinAPI上绝地包装器的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;
    

    所以这部片长约121分钟的电影的长度相当于98分钟。这是一个巨大的不同。我做错什么了?DWRATE是100万,DWSCALE是40K,所以FPS是完美的25。长147K MSDN says :_156;单位由dwrate和dwscale_157;定义。

    注:这是一个 follow-up from this question 但由于崩溃问题已经解决,我关闭了另一个问题,并将改进的内容移到了这里。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Adrien Plisson    15 年前

    msdn表示 dwScale 成员 AVIFILEINFO :

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

    您确定流不会覆盖 AVIFIFIL信息 结构?流的速率和比例存储在 AVISTREAMINFO 结构。

    推荐文章