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... [???]
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
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?
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]