function GrabAVIFrame(avifn: string; iFrameNumber: Integer; ToFileName: TFileName): Boolean; var Error: Integer; pFile: PAVIFile; AVIStream: PAVIStream; gapgf: PGETFRAME; lpbi: PBITMAPINFOHEADER; bits: PChar; hBmp: HBITMAP; AviInfo: TAVIFILEINFOW; sError: string; TmpBmp: TBitmap; DC_Handle: HDC; begin Result := False; // Initialize the AVIFile library. AVIFileInit;
// The AVIFileOpen function opens an AVI file Error := AVIFileOpen(pFile, PChar(avifn), 0, nil); if Error <> 0then begin AVIFileExit; case Error of AVIERR_BADFORMAT: sError := 'The file couldnot be read'; AVIERR_MEMORY: sError := 'The file could not be opened because of insufficient memory.'; AVIERR_FILEREAD: sError := 'A disk error occurred while reading the file.'; AVIERR_FILEOPEN: sError := 'A disk error occurred while opening the file.'; end; ShowMessage(sError); Exit; end;
// AVIFileInfo obtains information about an AVI file if AVIFileInfo(pFile, @AVIINFO, SizeOf(AVIINFO)) <> AVIERR_OK then begin // Clean up and exit AVIFileRelease(pFile); AVIFileExit; Exit; end;
// Show some information about the AVI Form1.Memo1.Lines.Add('AVI Width : ' + IntToStr(AVIINFO.dwWidth)); Form1.Memo1.Lines.Add('AVI Height : ' + IntToStr(AVIINFO.dwHeight)); Form1.Memo1.Lines.Add('AVI Length : ' + IntToStr(AVIINFO.dwLength));
// Open a Stream from the file Error := AVIFileGetStream(pFile, AVIStream, streamtypeVIDEO, 0); if Error <> AVIERR_OK then begin // Clean up and exit AVIFileRelease(pFile); AVIFileExit; Exit; end;
// Prepares to decompress video frames gapgf := AVIStreamGetFrameOpen(AVIStream, nil); if gapgf = nilthen begin AVIStreamRelease(AVIStream); AVIFileRelease(pFile); AVIFileExit; Exit; end;
// Read current Frame // AVIStreamGetFrame Returns the address of a decompressed video frame lpbi := AVIStreamGetFrame(gapgf, iFrameNumber); if lpbi = nilthen begin AVIStreamGetFrameClose(gapgf); AVIStreamRelease(AVIStream); AVIFileRelease(pFile); AVIFileExit; Exit; end;
// Show number of frames: Form1.Memo1.Lines.Add(Format('Framstart: %d FrameEnd: %d', [AVIStreamStart(AVIStream), AVIStreamEnd(AVIStream)]));
DC_Handle := CreateDC('Display', nil, nil, nil); try hBmp := CreateDIBitmap(DC_Handle, // handle of device context lpbi^, // address of bitmap size and format data CBM_INIT, // initialization flag bits, // address of initialization data PBITMAPINFO(lpbi)^, // address of bitmap color-format data DIB_RGB_COLORS); // color-data usage finally DeleteDC(DC_Handle); end;
procedure TForm1.Button1Click(Sender: TObject); begin // Extract Frame 3 from AVI file GrabAVIFrame('C:\Test.avi', 3, 'c:\avifram.bmp'); end; Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php