PDA

Ver la Versión Completa : Problema con pasaje de .AVI a .BMP


zugazua2001
08-07-2005, 05:56:50
Problema con pasaje de .AVI a .BMP

Hola a todos, yo copie un codigo de ejemplo de como capturar imagenes en formato .bmp de un archivo .AVI, bien dicho codigo lo corri sobre windows 98 y corria perfectamente
Formatie la maquina y me encontre que ahora lo ejecuto y me graba siempre la misma imagen, corro el archivo .AVI en el multimedia y corre perfectamente.
Que pudo haber pasado el codigo es el siguiente:

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 couldn''t 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
FichaCamara.Memo1.Lines.Add('AVI Width : ' + IntToStr(AVIINFO.dwWidth));
FichaCamara.Memo1.Lines.Add('AVI Height : ' + IntToStr(AVIINFO.dwHeight));
FichaCamara.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:
FichaCamara.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 TFichaCamara.BitBtn1Click(Sender: TObject);
var
Origen, DestBmp: String;
begin
Origen:='C:/Capture.Avi';
DestBmp:='C:/Rob.BMP';
if GrabAVIFrame(Origen,5,DestBmp)then
begin
Foto.Picture.LoadFromFile(DestBmp);
Foto.Stretch:= True;
end;
end;



Desde ya gracias por la molestia, si saben de donde puedo sacar codigo para pasar de .AVI a .JPG que sea mas legible se los agradeceria.
Saludos a todos.

zugazua2001
08-07-2005, 22:12:29
Hola al ejecutar la funcion me devuelve true, pero siempre la misma imagen.
Sigo la traza paso a paso, y todo anda bien, me fije que el número de frame variara y todo bien.
Puede ser algo relacionado con windows Xp, yo antes tenia instalado windows 98 y todo andaba perfecto.
Me ocurre también algo particular cuando corro la aplicación para capturar video con la web cam, corro la aplicación y me aparece un recuadro con valores de registros, en assembler sigo corriendo con F9 se pasa a otra linea de dicho recuadro y continuo hasta que aparece la pantalla principal de la aplicacion.
¿Esto también puede que sea por la versión de Windows, porque esta misma aplicación sobre windows 98 corría perfectamente?.
Bueno si alguien me responde esto se lo agradeceria muchisimo, porque sin esto no puedo seguir avanzando.
Gracias por todo nuevamente.

zugazua2001
09-07-2005, 03:44:10
Gracias, necesito solucionar esto porque sino no puedo avanzar.