Zapisywanie klatek z filmu

0

Potrzebuję sposobu, by zapisać klatkę z filmu w formacie avi. Gdzieś widziałem to rozwiązanie, ale zabrakło mi w pamięci jednego szczegółu...
Sposób polegał na tym, żeby odtworzyć film za pomocą komponentu TMediaPlayer, odtworzyć go na panelu, następnie...
i tu tkwi największy problem...
Nie wiem, jak "przekopiować" rysunek z jednego panelu na drugi,
a potem trzeba go zapisać... też nie bardzo wiem jak... [???]

0

sciagnij biblioteke VfW

a w swoim prgsie umiesc

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;

AVIFileInit;

Error := AVIFileOpen(pFile, PChar(avifn), 0, nil);
if Error 0 then
begin
AVIFileExit;
case Error of
AVIERR_BADFORMAT: sError := 'Nie mozna odczytac pliku';
AVIERR_MEMORY: sError := 'Problem z pamiecia';
AVIERR_FILEREAD: sError := 'Blad podczas odczytywania pliku';
AVIERR_FILEOPEN: sError := 'Blad podczas otwierania pliku';
end;
// ShowMessage(sError);
Exit;
end;

if AVIFileInfo(pFile, @AVIINFO, SizeOf(AVIINFO)) AVIERR_OK then
begin

AVIFileRelease(pFile); 
AVIFileExit; 
Exit; 

end;

Error := AVIFileGetStream(pFile, AVIStream, streamtypeVIDEO, 0);
if Error AVIERR_OK then
begin

AVIFileRelease(pFile); 
AVIFileExit; 
Exit; 

end;

gapgf := AVIStreamGetFrameOpen(AVIStream, nil);
if gapgf = nil then
begin
AVIStreamRelease(AVIStream);
AVIFileRelease(pFile);
AVIFileExit;
Exit;
end;

lpbi := AVIStreamGetFrame(gapgf, iFrameNumber);
if lpbi = nil then
begin
AVIStreamGetFrameClose(gapgf);
AVIStreamRelease(AVIStream);
AVIFileRelease(pFile);
AVIFileExit;
Exit;
end;

TmpBmp := TBitmap.Create;
try
TmpBmp.Height := lpbi.biHeight;
TmpBmp.Width := lpbi.biWidth;
bits := Pointer(Integer(lpbi) + SizeOf(TBITMAPINFOHEADER));

DC_Handle := CreateDC('Display', nil, nil, nil); 
try 
  hBmp := CreateDIBitmap(DC_Handle,
    lpbi^,
    CBM_INIT,
    bits,
    PBITMAPINFO(lpbi)^,
    DIB_RGB_COLORS);
finally 
  DeleteDC(DC_Handle); 
end; 

TmpBmp.Handle := hBmp; 
AVIStreamGetFrameClose(gapgf); 
AVIStreamRelease(AVIStream); 
AVIFileRelease(pfile); 
AVIFileExit; 
try 
  TmpBmp.SaveToFile(ToFileName); 
  Result := True; 
except 
end; 

finally
TmpBmp.Free;
end;
end;

//process extract audio

function SaveCallback(nPercent: Int): Bool; pascal;
begin
Application.ProcessMessages;

if abort = True then
Result := True
else
Result := False;
end;

i wywolaj

GrabAVIFrame('film.avi', numer_klatki, 'C:plik.bmp');

dobra nie czytalem postu ale odpowiedzialem na pytanie z tematu :P

0

Jest jeden problem... Obawiam się, że vfw działa pod delphi od 5 w górę, a mam niestety tylko 3... Nie ma jakiegoś innego sposobu?

0

Witam!!

Nie długo ukarze się na łamach <url>http://4programmers.net </url>artykuł mojego autorstwa poświęcony plikom avi. Co będzie zawierał artykuł?
Pokarzę w nim jak rozwiązać problem z wyciąganiem ścieżki dźwiękowej z całego avi`ka, zapisywanie poszczególnych klatek z filmu oraz wstawianie do filmu własnych klatek.

Czekajcie cierpliwie...

Pozdrawiam... [browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1