Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с кадрами в AVI [D7, WinXP]


Fenix ©   (2005-02-11 11:40:00) 

Есть код для извлечения кадра из 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

Как мне это сделать подскажите.
Заранее благодарен


Snake2K   (2005-03-20 19:27:00) [1]

Каково же решение, если можно?


Fenix   (2005-02-11 12:49:00) [2]

Было найдено решение, так что вопрос снимается


Наверх

Титульная страница Поиск, карта сайта Написать письмо