Форум: "Media";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
ВнизРабота с кадрами в AVI Найти похожие ветки
← →
Fenix (2005-02-11 11:40) [0]Есть код для извлечения кадра из AVI
uses VfW;
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;
Так вот проблема заключается в следующем
при выполнении этого кода всё идёт хорошо до строки
gapgf := AVIStreamGetFrameOpen(AVIStream, nil);
В случае если видео закодировано в XVID.
Проблема заключается в невозможности подобрать декодер для настроек по умолчанию.
надо задать
gapgf := AVIStreamGetFrameOpen(AVIStream, lpbiWanted);
предварительно настроив
lpbiWanted на RGB24
Как мне это сделать подскажите.
Заранее благодарен
← →
Fenix (2005-02-11 12:49) [1]Было найдено решение, так что вопрос снимается
← →
Snake2K (2005-03-20 19:27) [2]Каково же решение, если можно?
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.031 c