AVIFilelnfo(AVIFile, AVIlnfo, SizeOf (AVIlnfo));
AVIWidth := AVIInfo.dwWidth; // ΠΠ°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΊΠ°Π΄ΡΠ°
AVIHeight := AVIlnfo.dwHeight;
AVILength := AVIlnfo.dwLength; // ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠ°Π΄ΡΠΎΠ²
// ΠΡΡΠΈΡΠ»ΡΠ΅ΠΌ ΠΏΠ°ΡΠ·Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΡΠΌΠΈ ΠΊΠ°Π΄ΡΠ°ΠΌΠΈ
AVIDelay := 1000 div (AVIInfo.dwRate div AVIInfo.dwScale);
AVIFileRelease(AVIFile); // ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΠΌ AVI
ΠΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ FDDSImage, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡΡ Π²ΠΈΠ΄Π΅ΠΎ, ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΠΌΠΈ, ΡΠ°Π²Π½ΡΠΌΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΠΌ ΠΊΠ°Π΄ΡΠ° Π²ΠΈΠ΄Π΅ΠΎ:
ZeroMemory (@ddsd, SizeOf(ddsd));
with ddsd do begin
dwSize := SizeOf(ddsd);
dwFlags := DDSD_CAPS or DDSD_HEIGHT or DDSD_WIDTH;
ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN;
dwWidth := AviWidth;
dwHeight := AVIHeight;
end;
hRet := FDD.CreateSurface(ddsd, FDDSImage, nil);
if Failed(hRet) then ErrorOut(hRet, 'Create Second Surface');
Π ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π·Π°Π²ΠΎΠ΄ΠΈΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ Π΄Π»Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ ΠΊΠ°Π΄ΡΠ°, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΡΡΠ° ΠΏΡΡΠΌΠΎ Π½Π° ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΡ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ.
ΠΠΎΡΠ»Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ DirectDraw ΠΏΠΎΠ΄Π³ΠΎΡΠ°Π²Π»ΠΈΠ²Π°Π΅ΠΌΡΡ ΠΊ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΠΌ Π²ΠΈΠ΄Π΅ΠΎ:
procedure TfrmDD.FirstFrame;
var
wrkDC : HDC;
begin
AVIFilelnit; // ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ
// ΠΡΠΊΡΡΠ²Π°Π΅ΠΌ AVI-ΡΠ°ΠΉΠ» Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ
AVIStreamOpenFromFile(AviStream, AviName, streamtypeVIDEO,
0, OF_READ, nil);
// ΠΠ°Π³ΡΡΠΆΠ°Π΅ΠΌ ΠΏΠΎΡΠΎΠΊ
Frame := AVIStreamGetFrameOpen(AviStream, nil);
// ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΊΠ°Π΄Ρ Π²ΠΈΠ΄Π΅ΠΎ
pbmi := AVIStreamGetFrame(Frame, CurrFrame);
// ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΊΠ°ΡΡΠΈΠ½ΠΊΡ ΠΊΠ°Π΄ΡΠ°
bits := Pointer(Integer(pbmi) + SizeOf(TBITMAPINFOHEADER));
// ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π΄Π»Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ ΠΊΠ°Π΄ΡΠ° Π½Π° ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ
if FDDSImage.GetDC (wrkDC) = DD_OK then begin
// ΠΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌ ΠΊΠ°Π΄Ρ Π²ΠΎ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠ°ΡΡΡ
TmpBmp.Handle := CreateDIBitmap(
// ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠΌ ΡΠ»ΡΠΆΠΈΡ HDC ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ
wrkDC,
pbmi^, // ΠΠ΄ΡΠ΅Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠ°ΡΡΡΠ° ΠΈ ΡΠΎΡΠΌΠ°ΡΠ° Π΄Π°Π½Π½ΡΡ
CBM_INIT, // Π€Π»Π°Π³ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ
bits, // ΠΠ°Π½Π½ΡΠ΅ Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ
PBITMAPINFO(pbmi)^, // ΠΠ°Π½Π½ΡΠ΅ ΠΎ ΡΠΎΡΠΌΠ°ΡΠ΅ ΡΠ²Π΅ΡΠ°
DIB RGB_COLORS); // Π€Π»Π°Π³ ΡΠ²Π΅ΡΠ½ΠΎΡΡΠΈ ΡΠ°ΡΡΡΠ°
// ΠΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌ ΠΊΠ°ΡΡΠΈΠ½ΠΊΡ ΠΈΠ· Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΡΡΠ° Π½Π° ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ
BitBlt (wrkDC, Π, Π, AVIWidth, AVIHeight,
TinpBmp. Canvas .Handle, 0, 0, SRCCOPY);
FDDSImage.ReleaseDC (wrkDC);
end;
AVIClock := GetTickCount; // ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠΌΠ΅ΡΠ°
end;
ΠΠ΅ΠΉΡΡΠ²ΠΈΡ ΠΏΠΎ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ ΠΊΠ°Π΄ΡΠ° Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Ρ, Π½ΠΎ ΡΡΠ°ΡΠΈΡΡ Π²ΡΠ΅ΠΌΡ Π½Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π°Π΄ΡΠ΅ΡΠΎΠ² ΡΠ΅ΠΏΠ΅ΡΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ:
procedure Π’frmDD,NextFrame;
var
wrkDC : HDC;
begin
// ΠΠ°ΡΡΠ°Π»ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠ°Π΄Ρ AVI
if GetTickCount - AVIClock > AVIDelay then begin
pbmi := AVIStreamGetFrame(Frame, CurrFrame);
if FDDSImage.GetDC (wrkDC) = DD_OK then begin
TmpBmp.Handle := CreateDIBitmap(wrkDC, pbmi^, CBM_INIT,
bits, PBITMAPINFO(pbmi) Π, DIB_RGB__COLORS) ;
BitBlt (wrkDC, 0, 0, AVIWidth, AVIHeight,
TmpBmp.Canvas.Handle, 0, 0, SRCCOPY);
FDDSImage.ReleaseDC (wrkDC);
end;
// Π£Π²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΠΌ ΡΡΠ΅ΡΡΠΈΠΊ ΠΊΠ°Π΄ΡΠΎΠ²
CurrFrame := (CurrFrame + 1) mod AVILength;
AVIClock := GetTickCount;
end;
end;
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ AVI-ΡΠ°ΠΉΠ» Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π²ΡΠ»Π΅Π΄ Π·Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ ΠΊΠ°Π΄ΡΠΎΠΌ Π²ΡΠ΅ ΠΏΠΎΠ²ΡΠΎΡΡΠ΅ΡΡΡ Ρ Π½Π°ΡΠ°Π»Π°.
ΠΠ°Π΄Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ Π½Π° ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ FDDSimage, Π±Π»ΠΈΡΡΠΈΠ½Π³ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ.
ΠΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°Π±ΠΎΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈΡΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ:
AVIStreamRelease(AviStream); // ΠΠ°ΠΊΡΡΡΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ°
AVIFileExit; // ΠΠ°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ
TmpBmp.Free; // Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΡΡΠ°
ΠΡΠ°ΠΊ, ΡΠ΅ΠΏΠ΅ΡΡ Π²Ρ ΡΠΏΠΎΡΠΎΠ±Π½Ρ Π΄Π΅Π»Π°ΡΡ Π²ΠΈΠ΄Π΅ΠΎ ΡΠ°ΡΡΡΡ Π²Π°ΡΠΈΡ ΠΈΠ³Ρ, Π½ΠΎ Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅Π΄ΠΈΡΡ, ΡΡΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ Ρ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΡΠΈΠΏΠΎΠΌ ΡΠΆΠ°ΡΠΈΡ. ΠΠΎ ΡΡΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅ Ρ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ Π·Π°ΡΡΠ°Π²ΠΊΠΈ ΠΈΠ³Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌ Π΄Π»Ρ Delphi ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ.
ΠΠΎΠ΄ΡΠ»Ρ DirectShow
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΡΠΏΠΎΡΠΎΠ± Π³ΠΎΠ΄ΠΈΡΡΡ Π½Π΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎ, Π½Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π±Π΅Π³Π»ΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠΏΠΎΡΠΎΠ± Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ Π²ΠΈΠ΄Π΅ΠΎ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ DirectShow. ΠΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠ°ΠΊΠΆΠ΅ Π²Ρ ΠΎΠ΄ΠΈΡ Π² ΡΠΎΡΡΠ°Π² DirectX, Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π½Π°Π±ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΌΡΠ»ΡΡΠΈΠΌΠ΅Π΄ΠΈΠ°. ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Π΅Π΅ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ, ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠΌΡΡ Ρ Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° ΠΡ 02, Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ΅ΠΌ AVI-ΡΠ°ΠΉΠ» Π½Π° ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ (ΡΠΈΡ. 6.2).
Π€Π°ΠΉΠ» Π²ΠΈΠ΄Π΅ΠΎ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠ°ΠΊΠΆΠ΅ Π²Π·ΡΡ ΠΌΠ½ΠΎΡ ΠΈΠ· ΠΏΠ°ΠΊΠ΅ΡΠ° DirectX SDK.
ΠΡΠΈ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΈ ΡΠ°ΠΉΠ»Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ VFW ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ° ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΈΡΠΊΠ°ΠΆΠ΅Π½Π½ΠΎΠΉ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΈ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΏΡΠΈΠ±Π΅Π³Π°ΡΡ ΠΊ ΠΈΠ½ΠΎΠΌΡ ΡΠΏΠΎΡΠΎΠ±Ρ. ΠΡΠΊΠ°Π·Π°ΡΡΡΡ ΠΎΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° ΠΌΡ ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ DirectShow ΡΠΎΠΆΠ΅ Π³ΠΎΠ΄ΠΈΡΡΡ Π½Π΅ Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. ΠΡΡΠ³Π°Ρ ΠΏΡΠΈΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠ΅ΡΠ΄ΡΡΠ²ΠΎΠ²Π°ΡΡ Π² ΠΈΠ·ΡΡΠ΅Π½ΠΈΠΈ ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ, ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π»ΠΈΡΡ Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°ΠΌΠΈ ΡΠ°Π½Π½ΠΈΡ Π²Π΅ΡΡΠΈΠΉ.
ΠΠΎΠ΄ΡΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π‘ΠΠ-ΠΌΠΎΠ΄Π΅Π»Ρ, ΠΏΠΎΡΡΠΎΠΌΡ Π·Π΄Π΅ΡΡ ΠΌΡ Π²ΡΡΡΠ΅ΡΠΈΠΌ Π·Π½Π°ΠΊΠΎΠΌΡΠ΅ ΠΏΠΎΠ½ΡΡΠΈΡ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ²:
var
AMStream : lAMMultiMediaStream; // ΠΠ»Π°Π²Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ
PrimaryVidStream : IMediaStream; // ΠΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΠΎΡΠΎΠΊ, ΡΠ²ΡΠ·Π°Π½ Ρ Π²ΠΈΠ΄Π΅ΠΎ
Sample : IDirectDrawStreamSample; // ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° Π½Π° ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ
Π ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ° ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΠΈΠΌΡ ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°:
procedure TfrmDD.PlayMedia(const FileName: WideString);
var
hRet : HRESULT;
begin
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ('filter graph1)
AMStream:=IAMMultiMediaStream(CreateComObject
(CLSID_AMMultiMediaStream));
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ
hRet := AMStream.Initialize(STREAMTYPE_READ, 0, nil);
if Failed (hRet) then ErrorOut (hRet, 'Stream Initialize');
// ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ° Π²ΠΈΠ΄Π΅ΠΎ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ
hRet := AMStream.AddMediaStream(FDD, MSPID_PrimaryVideo,
0, IMediaStream(ni!A));
if Failed (hRet) then ErrorOut (hRet, 'Add Video Stream');
// ΠΡΠΊΡΡΡΠΈΠ΅ ΡΠ°ΠΉΠ»Π°
hRet := AMStream.OpenFile(PWideChar(FileName) , 0);
if Failed (hRet) then ErrorOut (hRet, 'Open AVI File');
// Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ Π΄Π»Ρ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΈ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ
// ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΡΠ΅ΡΠ½Π΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°
hRet := (AMStream as IMultiMediaStream).
GetMediaStream(MSPID_PrimaryVideo, PrimaryVidStream);
if Failed (hRet) then ErrorOut (hRet, 'GetMediaStream');
// ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π² ΡΠΈΠΏ Isample
//ΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ Π΅Π³ΠΎ Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡΡ
hRet := (PrimaryVidStream as IDirectDrawMediaStream).
CreateSample (FDDS Image, TRect(nil/4), 0, Sample);
if Failed (hRet) then ErrorOut (hRet, 'CreateSample');
// ΠΠ°ΠΏΡΡΠΊ ΠΏΠΎΡΠΎΠΊΠ°
hRet := (AMStream as IMultiMediaStream).SetState(STREAMSTATE_RUN);
if Failed (hRet) then ErrorOut (hRet, 'SetState');
end;
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ Ρ ΠΎΡΡΠ°Π²ΠΈΠ» ΠΏΡΠ΅ΠΆΠ½Π΅ΠΉ, Π½ΠΎ ΠΊΠΎΠ΄Ρ ΠΎΡΠΈΠ±ΠΎΠΊ Π½Π΅ Π±ΡΠ΄ΡΡ ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΡΡΡ. ΠΠΎΠ΄ΡΠ»Ρ DirectDraw Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΏΠΎΡΡΠ½Π΅Π½ΠΈΡ ΠΏΠΎ ΡΡΠΈΠΌ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌ.
ΠΠ΅ΡΠ΅Π΄ Π±Π»ΠΈΡΡΠΈΠ½Π³ΠΎΠΌ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ FDDS image ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΠΏΠΎΠ·ΠΈΡΠΈΡ Π² Π²ΠΈΠ΄Π΅ΠΎ:
if Sample.Update(0, 0, nil, 0) <> S_OK
then (AMStream as IMultiMediaStream).Seek (0);
ΠΠ΅ΡΠ΄Π°ΡΠ° ΡΠ²ΠΈΠ΄Π΅ΡΠ΅Π»ΡΡΡΠ²ΡΠ΅Ρ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π²ΠΈΠ΄Π΅ΠΎ ΠΏΡΠΎΠΊΡΡΡΠ΅Π½ΠΎ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ°, Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ Π·Π°Π½ΠΎΠ²ΠΎ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π΅Π³ΠΎ.
Π‘Π°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°Π·Π±Π΅ΡΠΈΡΠ΅ΡΡ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΠΎΠ»ΠΈΠΊ ΠΏΡΠΈ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠΊΠ½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈ ΠΊΠ°ΠΊ Π·Π°Π½ΠΎΠ²ΠΎ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΏΠΎΡΠΎΠΊ ΠΏΡΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ.
ΠΠ°ΠΏΠΈΡΡ Π² Π²ΠΈΠ΄Π΅ΠΎΡΠ°ΠΉΠ»
.ΠΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠ²ΡΠΈΡΡ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ Π²ΠΈΠ΄Π΅ΠΎΠ΄Π°Π½Π½ΡΡ , ΠΌΡ Π½Π°ΡΡΠΈΠΌΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ AVI-ΡΠ°ΠΉΠ»Ρ. ΠΡΠΎΠΉΠ΄Π΅Ρ ΡΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡ Π΄Π»Ρ Π²Π°Ρ ΠΎΡΠ΅Π½Ρ Π»Π΅Π³ΠΊΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΌΡ Π³ΠΎΡΠΎΠ²ΡΠΌ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ AviMaker. ΠΠ½ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ° TAviMaker, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠ΅Π³ΠΎ Π·Π° Π½Π°Ρ Π²ΡΡ ΠΈΠ·Π½ΡΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ°Π±ΠΎΡΡ. ΠΠ°ΠΌ ΠΎΡΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΡ Π½Π°Π±ΠΎΡ ΡΠ°ΡΡΡΠΎΠ², ΡΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΊΠ°Π΄ΡΠΎΠ² ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠΈΠ»ΡΠΌΠ°, ΠΈ Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ Π·Π°ΠΏΠΈΡΠΈ.
ΠΠΎΡ ΡΠΊΡΠΎΠΌΠ½ΡΠΉ Π½Π°Π±ΠΎΡ ΡΠ²ΠΎΠΉΡΡΠ² ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΊΠ»Π°ΡΡΠ°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ Π½Π°ΠΌ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ:
Bitmaps TList; // Π‘ΠΏΠΈΡΠΎΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΊΠ»Π°ΡΡΠ° Bitmap, ΠΊΠ°Π΄ΡΡ AVI
Height Integer; // Π Π°Π·ΠΌΠ΅ΡΡ ΠΊΠ°Π΄ΡΠΎΠ² AVI
Width Integer;
FrameTime Integer; // ΠΠ΅Π»ΠΈΡΠΈΠ½Π° ΠΏΠ°ΡΠ·Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ°Π΄ΡΠ°ΠΌΠΈ
Stretch BOOL; // ΠΡΠΈΠ·Π½Π°ΠΊ, Π½Π°Π΄ΠΎ Π»ΠΈ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠ°Π΄ΡΡ
FileName String; // ΠΠΌΡ ΡΠ°ΠΉΠ»Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°
PixelFormat : TPixelFormat; // Π Π°Π·ΡΡΠ΄Π½ΠΎΡΡΡ AVI
constructor Create;
destructor Destroy; override;
procedure Write; // ΠΠ°ΠΏΠΈΡΡ AVI
ΠΠ΄Π΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ VFW, ΠΏΠΎΡΡΠΎΠΌΡ Π² ΠΎΠΏΡΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΡΡ ΠΊ ΡΠ°ΠΉΠ»Ρ ole2.dcu. Π ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° ΠΡ 03 ΡΠΎΡΠΌΠΈΡΡΡΡΡΡ ΠΊΠ°Π΄ΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΡ Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΡΠΏΠΈΡΠ°Π»Ρ (ΡΠΈΡ. 6.3).
Π ΠΈΡ. 6.3. ΠΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠ°Π΄ΡΠΎΠ² Π½Π°ΡΠ΅Π³ΠΎ ΡΠΈΠ»ΡΠΌΠ° Π‘ΠΎΠ·Π΄Π°Π΅ΡΡΡ
ΠΠ»Ρ Π·Π°ΠΏΠΈΡΠΈ ΡΠΈΠ»ΡΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ AviMakeri ΠΊΠ»Π°ΡΡΠ° TAviMaker:
AviMakerI := TAviMaker.Create;
with AviMakeri do begin
Width := 256;
Height := 256;
Stretch := True; // ΠΠ°Π΄ΡΡ Π±ΡΠ΄ΡΡ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°ΡΡΡΡ
PixelFormat := pf24bit; // 24-Π±ΠΈΡΠ½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ ΠΊΠ°Π΄ΡΠ°
FrameTime := 100;
FileName := 'test.avi';
end;
ΡΠΈΠ»ΡΠΌ ΠΈΠ· 20-ΡΠΈ ΠΊΠ°Π΄ΡΠΎΠ², ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ 2 ΡΠ΅ΠΊΡΠ½Π΄Ρ:
function TfrmDD.UpdateFrame : HRESULT;
const
step = 2 * Pi / 400;
var
i : Integer;
hRet : HRESULT;
Πitmap : Π’Π i tmap; DC : HOC;
begin
ThisTickCount := GetTickCount;
// Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΠ°ΡΠ·Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΈ Π½Π΅ Π΄Π΅Π»Π°ΡΡ
if ThisTickCount - LastTickCount > 30 then begin
Angle := Angle + 0.25;
if Angle > 2 * Pi then Angle := Angle - 2 * Pi;
LastTickCount := GetTickCount;
// ΠΠ΅ΡΠ΅ΠΌ 20 ΠΊΠ°Π΄ΡΠΎΠ²
Inc (FrameCount);
if FrameCount > 20 then begin
FActive := False;
Result := DD_OK;
AviMakerl.Write; // ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ AVI
Close;
Exit;
end;
// ΠΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΠΎΠ½
hRet := FDDSBack. BltFast (0, 0, E'DDSBackGround,
nil, DDBLTFAST_WAIT);
if hRet = DDERR_SURFACELOST then begin
Result := hRet;
if Failed (RestoreAll) then Exit;
end;
// ΠΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΠΎΡΠΊΠΈ ΡΠΏΠΈΡΠ°Π»ΠΈ for i := 0 to 800 do
if FDDSBack.BltFast (310 + trunc (cos(Angle -f i * step) * i / 4) ,
230 + trunc (sin(Angle + i * step) *i / 4),
FDDSImage, nil,
DDBLTFAST_WAIT) = DDERR_SURFACELOST then begin
hRet := RestoreAll;
if Failed (hRet) then begin
Result := hRet; Expend;
end;
// Π€ΠΎΡΠΌΠΈΡΡΠ΅ΠΌ ΠΊΠ°Π΄Ρ ΡΠΎΠ»ΠΈΠΊΠ°
Bitmap := TBitmap.Create;
with Bitmap do begin Width := ScreenWidth;
Height := ScreenHeight;
PixelFormat := pf24bit; // ΠΠ°ΠΆΠ½ΠΎ, ΠΈΠ½Π°ΡΠ΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ 8 Π±ΠΈΡ
FDDSBack.GetDC (DC);
BitBlt(Canvas.Handle, 0, 0, // ΠΠΎΠΏΠΈΡΡΠ΅ΠΌ ΡΠΊΡΠ°Π½ Π² ΡΠ°ΡΡΡ
ScreenWidth, ScreenHeight, DC, 0, 0, SRCCOPY);
FDDSBack.ReleaseDC (DC) ;
AviMakerl.Bitmaps.Add (Bitmap); // ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΊΠ°Π΄Ρ Π² ΡΠΈΠ»ΡΠΌ
end;
end;
Result := DD_OK;
end;
ΠΠ°Π΄ΡΡ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΡΡΡΡ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠΈ ΡΠΈΠ»ΡΠΌΠ°, Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ ΠΈΡΠΏΡΠ°Π²ΡΡΠ΅ ΠΊΠΎΠ΄ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΠ»ΠΎ ΠΏΡΠΈ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΏΠΈΡΠΊΠ°.