我在 WinAPI 上使用 JEDI 包装器中的 VFW 单元。
我正在编写的代码旨在搜索用户驱动器并检测warez。我们进行 MP3、WMA 和一些图形文件搜索。现在我们要检测非法电影。我想打开 AVI 文件,从中读取一些详细信息并关闭它。我有以下代码:
uses WFV; //from JEDI api wrappers
procedure TForm1.Button1Click(Sender: TObject);
var
lInfo : TAVIFILEINFO lFile : IAVIFILE;
lFileType : string;
lLenMinutes : integer;
lFPS : integer;
begin
{init file}
AVIFileInit;
{Open file - note: since we search for warez this is perfely "warezy" file}
AVIFileOpen(lFile, 'e:\Sideways KLAXXON\Sideways KLAXXON.avi', OF_READ, nil);
{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);
{Closing the file}
AVIFileRelease (lFile);
{and here goes the crash}
FreeAndNil(lFile);
end;
有两个问题:
- lLenMinutes 等于 98,而电影大约是两个小时。dwRate 是 100 万,dwScale 是 40k,所以 FPS 是完美的 25。MSDN说:“单位由 dwRate 和 dwScale 定义”。
- 代码在 FreeAndNil 行崩溃。为什么?我假设我负责释放 lFile(至少我觉得应该释放文件)。如果不符合 FreeAndNil,我在退出程序时会出现访问违规。
那么,您知道如何从 AVI 文件中正确获取电影时长吗?为什么会崩溃?
编辑
电影是 2 小时一分钟,所以结果应该非常接近 120。lFile 在 Jedi 中声明为:
IAVIFile = interface(IUnknown)
AVIFileOpen 在 JEDI 中声明为:
函数 AVIFileOpen(var ppfile: IAVIFILE; szFile: LPCWSTR; uMode: UINT; lpHandler: PCLSID): HResult; 标准调用;外部 AVIFILDLL 名称 'AVIFileOpenW';
在 MSDN 中:
STDAPI AVIFileOpen( PAVIFILE *ppfile, LPCTSTR szFile, UINT 模式, CLSID pclsidHandler );
MSDN 说:
“AVIFileOpen 函数打开一个 AVI 文件并返回用于访问它的文件接口的地址。”
所以我假设对象是由这个函数创建的。
编辑 2
avi 文件长度已移至新问题,因为 mghie 回答了这个问题。