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

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

Ошибка при проигрывании 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


Наверх

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