Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.042 c
14-1119443440
Магнум
2005-06-22 16:30
2005.07.18
Windows Task Manager в Windows XP


3-1118294178
msguns
2005-06-09 09:16
2005.07.18
Проблема чтения данных Paradox 3.5 (DOS)


3-1118270772
DRON1173
2005-06-09 02:46
2005.07.18
Обработка ошибок при работе с базой.


1-1119671688
Starcom
2005-06-25 07:54
2005.07.18
ProgressBar как к нему привязать выполнение ... процесса?


14-1119904045
BigMac
2005-06-28 00:27
2005.07.18
Forex





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский