![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разделение AVI файла [D7, WinXP]
Antonmm2 © (2004-09-24 20:46:00)Как разделить AVI файл на отдельные кадры, и потом сохранить каждый кадр под отдельным файлом bmp или jpg?
ZDimitriy (2004-09-29 09:48:00) [1]используй это:
uses
VfW { from download };
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 <> 0 then
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 = nil then
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 = nil then
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)]));
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, // 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;
TmpBmp.Handle := hBmp;
AVIStreamGetFrameClose(gapgf);
AVIStreamRelease(AVIStream);
AVIFileRelease(pfile);
AVIFileExit;
try
TmpBmp.SaveToFile(ToFileName);
Result := True;
except
end;
finally
TmpBmp.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// Extract Frame 3 from AVI file
GrabAVIFrame('C:\Test.avi', 3, 'c:\avifram.bmp');
end;
NailMan (2004-09-27 15:53:00) [2]DirectShow + фильтр ISampleGrabber внедряемый в граф.
ЗЫ: Это что касается программного исполнения. Подробности смотри в DX SDK, там и примеры есть.
---
WBR, NailMan aka 2:5020/3337.13
miek (2004-09-25 23:23:00) [3]Есть еще плагин для FAR-а. Но работает он на больших файлах ужасно медленно.
PGM_X (2004-09-25 23:11:00) [4]Video For Windows:
Инициализация:
AVIFileOpen
AVIFileGetStream
AVIStreamGetFrameOpen
В цикле AVIStreamGetFrame и сохраняй полученные кадры
И не забудь
AVIStreamRelease
AVIFileRelease
Antonmm2 (2004-09-24 20:53:00) [5]С помощью своей программы
Defunct (2004-09-24 20:47:00) [6]Abobe Premier