Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.04;
Скачать: CL | DM;

Вниз

Ошибка при проигрывании Avi   Найти похожие ветки 

 
Зм1й ©   (2005-10-30 14:17) [0]

Я хочу проиграть 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-02 19:51) [1]

Up


 
PAVIA ©   (2005-11-02 20:32) [2]

в первом случае у тебя не проинецеализован
PFrame: IGetFrame;
и равен nil. Отсюда и ошибка.


 
Зм1й ©   (2005-11-02 21:24) [3]


> в первом случае у тебя не проинецеализован
> PFrame: IGetFrame;
> и равен nil. Отсюда и ошибка.

Но он же инициализируется в процедуре LoadFromFile


 
Зм1й ©   (2005-11-03 14:31) [4]

Всё, разобрался. Обсуждение закрыто



Страницы: 1 вся ветка

Текущий архив: 2006.06.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.041 c
3-1144808929
konrads
2006-04-12 06:28
2006.06.04
Странности TQuery


1-1146450343
Nikolaich
2006-05-01 06:25
2006.06.04
проблема с порядком окон после активации подсказки


15-1147128713
Петр
2006-05-09 02:51
2006.06.04
Преобразование из StringGrid в DBGrid


15-1146900767
worldmen
2006-05-06 11:32
2006.06.04
Регистрация почтового ящика на fastmail.fm


1-1145951672
001
2006-04-25 11:54
2006.06.04
Очередь сетевого принтера