0

WinAPI で JEDI ラッパーの VFW ユニットを使用しています。

私が書いているコードは、ユーザーのドライブを検索してウェアーズを検出することを目的としています (注: 一部のファイルが合法かどうかを判断することは、この質問の範囲を超えています)。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 は次のように述べています。

注: これはこの質問のフォローアップですが、クラッシュの問題が解決されたため、他の質問をクローズし、改善されたコンテンツをここに移動しました。

4

1 に答える 1

2

MSDN は のdwScaleメンバーについてAVIFILEINFO次のように述べています。

どのストリームでも、ファイルのタイム スケールに取って代わる独自のタイム スケールを定義できます。

AVIFILEINFOストリームが構造体で指定されたレートとスケールをオーバーライドしていないと確信していますか? ストリームのレートとスケールはAVISTREAMINFO構造体に格納されます。

于 2009-11-20T13:02:52.950 に答える