Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π“Ρ€Π°Ρ„ΠΈΠΊΠ° DirectX Π² DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 38

Автор ΠœΠΈΡ…Π°ΠΈΠ» ΠšΡ€Π°ΡΠ½ΠΎΠ²

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;


ΠšΠ°Π΄Ρ€Ρ‹ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ записи Ρ„ΠΈΠ»ΡŒΠΌΠ°, Π² качСствС упраТнСния ΠΈΡΠΏΡ€Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠ΄ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ происходило ΠΏΡ€ΠΈ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ списка.