2009-11-20 5 views
0

WinAPI의 JEDI wrapper에서 VFW 유닛을 사용하고 있습니다.AVI 파일 길이 얻기

필자가 작성한 코드는 사용자 드라이브를 검색하고 warez를 검색하기위한 것입니다 (참고 : 일부 파일이 합법적인지 여부를 결정하는 것은이 질문의 범위를 벗어납니다). 우리는 MP3, WMA 및 일부 그래픽 파일 검색을 수행합니다. 이제 불법적 인 영화를 찾고자합니다. AVI 파일을 열어서 거기에서 몇 가지 세부 사항을 읽고 닫고 싶습니다. 영화에 대한 121분 오래 동안

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와 같은 무언가이다 : 나는 다음과 같은 코드가 있습니다. 이것은 큰 차이입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? dwRate는 1 백만이고 dwScale은 40k이므로 FPS는 완벽하게 25입니다. dwLength는 147k MSDN says : "단위는 dwRate 및 dwScale에 의해 정의됩니다."

참고 : 이것은 follow-up from this question이지만 충돌 문제가 해결 되었기 때문에 다른 질문을 닫고 여기에서 향상된 콘텐츠를 옮겼습니다.

+0

WFV는 매우 쓸모가 없습니다. – Ampere

답변

2

MSDN은 AVIFILEINFOdwScale 구성원에 대해 말한다 :

모든 스트림이 파일의 시간 스케일을 대체하기 위해 자신의 시간 스케일을 정의 할 수 있습니다.

스트림이 AVIFILEINFO 구조에 지정된 속도와 스케일보다 우선 적용되지 않습니까? 스트림에 대한 비율 및 스케일은 AVISTREAMINFO 구조에 저장됩니다.