![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при проигрывании Avi [Delphi, Windows]
Зм1й © (2005-10-30 14:17:00)Я хочу проиграть avi-файл под OpenGL, вот код:
var
PStream: IAviStream;
PFrame: IGetFrame;
PBits: Pointer;
bmp: TBitMap;
Width, Height, Length: DWord;
TimerCount: DWord;
CurrentFrame: DWord;
procedure TAviFilm.LoadFromFile(FileName: String);
var
f: IAviFile;
fi: TAviFileInfo;
begin
AviFileOpen(f, PChar(FileName), OF_READ, nil);
AviFileInfo(f, fi, SizeOf(fi));
Width:=fi.dwWidth;
Height:=fi.dwHeight;
Length:=fi.dwLength;
AviFileRelease(f);
AviFileInit;
bmp:=TBitMap.Create;
bmp.Width:=512;
bmp.Height:=512;
AviStreamOpenFromFile(PStream, PChar(FileName), StreamTypeVideo, 0, OF_READ, nil);
PFrame:=AviStreamGetFrameOpen(PStream, nil);
end;
procedure TAviFilm.Timer;
var
HlpBmp: TBitmap;
dc: hDC;
ph: PBitmapInfoHeader;
HlpStream: TFileStream;
begin
Inc(TimerCount);
if TimerCount>=2 then begin
HlpBmp:=TBitMap.Create;
TimerCount:=0;
ph:=AviStreamGetFrame(PFrame, CurrentFrame);
PBits:=Pointer(Integer(ph)+SizeOf(TBitMapInfoHeader));
DC:=CreateDC('display', nil, nil, nil);
HlpBmp.Handle:=CreateDIBitMap(dc, ph^, CBM_INIT, PBits, PBitMapInfo(ph)^, DIB_RGB_COLORS);
bmp.Canvas.StretchDraw(Bounds(0, 0, 512, 512), HlpBmp);
Inc(CurrentFrame);
end;
// код вывода bmp как текстуры...
end;
На выделенной строке вылетает Access Violation. А вот этот код работает:
var
PStream: IAviStream;
PFrame: IGetFrame;
PBits: Pointer;
bmp: TBitMap;
Width, Height, Length: DWord;
TimerCount: DWord;
CurrentFrame: DWord;
procedure TAviFilm.LoadFromFile(FileName: String);
var
f: IAviFile;
fi: TAviFileInfo;
ph: PBitmapInfoHeader;
begin
AviFileOpen(f, PChar(FileName), OF_READ, nil);
AviFileInfo(f, fi, SizeOf(fi));
Width:=fi.dwWidth;
Height:=fi.dwHeight;
Length:=fi.dwLength;
AviFileRelease(f);
AviFileInit;
bmp:=TBitMap.Create;
bmp.Width:=512;
bmp.Height:=512;
AviStreamOpenFromFile(PStream, PChar(FileName), StreamTypeVideo, 0, OF_READ, nil);
PFrame:=AviStreamGetFrameOpen(PStream, nil);
AviStreamRelease(PStream);
ph:=AviStreamGetFrame(PFrame, CurrentFrame);
PBits:=Pointer(Integer(ph)+SizeOf(TBitMapInfoHeader));
end;
procedure TAviFilm.Timer;
var
HlpBmp: TBitmap;
dc: hDC;
ph: PBitmapInfoHeader;
HlpStream: TFileStream;
begin
Inc(TimerCount);
if TimerCount>=2 then begin
HlpBmp:=TBitMap.Create;
TimerCount:=0;
AviStreamOpenFromFile(PStream, PChar('Temp\25'), StreamTypeVideo, 0, OF_READ, nil);
PFrame:=AviStreamGetFrameOpen(PStream, nil);
ph:=AviStreamGetFrame(PFrame, CurrentFrame);
PBits:=Pointer(Integer(ph)+SizeOf(TBitMapInfoHeader));
DC:=CreateDC('display', nil, nil, nil);
HlpBmp.Handle:=CreateDIBitMap(dc, ph^, CBM_INIT, PBits, PBitMapInfo(ph)^, DIB_RGB_COLORS);
bmp.Canvas.StretchDraw(Bounds(0, 0, 512, 512), HlpBmp);
AviStreamRelease(PStream);
Inc(CurrentFrame);
end;
// код вывода bmp как текстуры...
end;
Объясните пожалуста, в чём ошибка?! Мне ОЧЕНЬэто важно, я уже отчаялся найти ошибку...
Зм1й (2005-11-03 14:31:00) [1]Всё, разобрался. Обсуждение закрыто
Зм1й (2005-11-02 21:24:00) [2]
> в первом случае у тебя не проинецеализован
> PFrame: IGetFrame;
> и равен nil. Отсюда и ошибка.
Но он же инициализируется в процедуре LoadFromFile
PAVIA (2005-11-02 20:32:00) [3]в первом случае у тебя не проинецеализован
PFrame: IGetFrame;
и равен nil. Отсюда и ошибка.
Зм1й (2005-11-02 19:51:00) [4]Up