Главная страница
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.047 c
1-1146041042
tickler
2006-04-26 12:44
2006.06.04
обратная нумерация строк в memo


8-1135496232
vitaliy14
2005-12-25 10:37
2006.06.04
Окнтуривание изображений


2-1148036197
SamProf
2006-05-19 14:56
2006.06.04
Как запустить рограмму


2-1148016114
Близнец
2006-05-19 09:21
2006.06.04
ShellExecuteEx и WaitForSingleObject


15-1146990913
Gast
2006-05-07 12:35
2006.06.04
День радио