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이지만 충돌 문제가 해결 되었기 때문에 다른 질문을 닫고 여기에서 향상된 콘텐츠를 옮겼습니다.
WFV는 매우 쓸모가 없습니다. – Ampere