Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.18;
Скачать: CL | DM;

Вниз

Работа с кадрами в 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 вся ветка

Текущий архив: 2005.07.18;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.045 c
10-1096498814
Ivan K
2004-09-30 03:00
2005.07.18
Тупой вопрос. Как вытащить данные из xml?


8-1111582014
Zoidberg
2005-03-23 15:46
2005.07.18
Создание трехмерного объекта в OpenGL


14-1118898728
syte_ser78
2005-06-16 09:12
2005.07.18
Опять аквариумом решил занятся.


14-1119789328
Chuvak
2005-06-26 16:35
2005.07.18
DVD+-RW?


14-1119646094
palva
2005-06-25 00:48
2005.07.18
Заплати налоги и спи спокойно