我写了一个bmp 转 avi 的过程,可以转成avi,但退出过程时会报错
“Access violation at adress 00000000.Read of address 00000000”
下面是代码,大家帮我看一下,哪出错了,是不是指针上的问题。
procedure TForm1.BmpToAvi(FileDir: string;Filedest:string);
var
Sr:TSearchRec;
FileAtr:integer;
str:string;
bFind:Integer;
nFrames:integer;
// hr:HRESULT;
tmp_buf:pchar; fp:hFile;
StreamInfo:TAVISTREAMINFO;
pFile:IAVIFILE;
ps:IAVISTREAM;
bmpFileHeader:BITMAPFILEHEADER;
bmpInfoHeader:BITMAPINFOHEADER;
begin
nFrames:=0;
str:=FileDir+'*.*';
AVIFileInit(); bFind:=FindFirst(str,faAnyFile,sr);
while (bFind=0) do
begin
bFind:=FindNext(Sr);
if (Sr.Name[1]<>'.') and (sr.Attr<>faDirectory) then
begin str:=ExpandFileName(Sr.Name);
fp:=_lopen(pChar(str),OF_READWRITE);
//fp:=FileOpen(str,fmOpenWrite); _llseek(fp,0,FILE_BEGIN);
//FileSeek(fp,0,0);
_lread(fp,@bmpFileHeader,sizeof(bmpFileHeader));
//FileRead(fp,bmpFileHeader,sizeof(bmpFileHeader));
_lread(fp,@bmpInfoHeader,sizeof(BITMAPINFOHEADER));
//FileRead(fp,bmpInfoHeader,sizeof(BITMAPINFOHEADER)); // tmp_buf:= nil; if (nFrames=0) then
begin
AVIFileOpen(pFile,PChar(Filedest),OF_WRITE or OF_CREATE,nil);
FillMemory(@StreamInfo,sizeof(StreamInfo),0);
StreamInfo.fccType:=streamtypeVIDEO;
StreamInfo.fccHandler := 0;
StreamInfo.dwScale := 1;
StreamInfo.dwRate := 15; // 15 fps
StreamInfo.dwSuggestedBufferSize := bmpInfoHeader.biSizeImage ;
SetRect(StreamInfo.rcFrame, 0, 0, bmpInfoHeader.biWidth, bmpInfoHeader.biHeight);
{hr :=} AVIFileCreateStream(pFile,ps,StreamInfo);
end; getmem(tmp_buf,bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3);
//SetLength(tmp_buf,bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3); _lread(fp,tmp_buf,bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3);
//FileRead(fp,tmp_buf,bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3);
{hr :=} AVIStreamSetFormat(ps,nFrames,@bmpInfoHeader,sizeof(bmpInfoHeader)); {hr :=} AVIStreamWrite(ps, // stream
nFrames , // time of this frame
1, // number to write
tmp_buf,
bmpInfoHeader.biSizeImage , // size of this frame
AVIIF_KEYFRAME, // flags....
Nil,
Nil);
nFrames:=nFrames+1;
freemem(tmp_buf);
_lclose(fp);
//FileClose(fp);
//freemem(tmp_buf);
end;
end;
if (ps<>nil) then
begin
AVIStreamClose(ps);
end; if (pfile <> nil) then
begin
AVIFileRelease(pfile);
end;//tmp_buf:=nil;
AVIFileExit();
end;
各位兄弟劳神看一下,如果有现成的代码,发过来参考一下就感激不尽了
“Access violation at adress 00000000.Read of address 00000000”
下面是代码,大家帮我看一下,哪出错了,是不是指针上的问题。
procedure TForm1.BmpToAvi(FileDir: string;Filedest:string);
var
Sr:TSearchRec;
FileAtr:integer;
str:string;
bFind:Integer;
nFrames:integer;
// hr:HRESULT;
tmp_buf:pchar; fp:hFile;
StreamInfo:TAVISTREAMINFO;
pFile:IAVIFILE;
ps:IAVISTREAM;
bmpFileHeader:BITMAPFILEHEADER;
bmpInfoHeader:BITMAPINFOHEADER;
begin
nFrames:=0;
str:=FileDir+'*.*';
AVIFileInit(); bFind:=FindFirst(str,faAnyFile,sr);
while (bFind=0) do
begin
bFind:=FindNext(Sr);
if (Sr.Name[1]<>'.') and (sr.Attr<>faDirectory) then
begin str:=ExpandFileName(Sr.Name);
fp:=_lopen(pChar(str),OF_READWRITE);
//fp:=FileOpen(str,fmOpenWrite); _llseek(fp,0,FILE_BEGIN);
//FileSeek(fp,0,0);
_lread(fp,@bmpFileHeader,sizeof(bmpFileHeader));
//FileRead(fp,bmpFileHeader,sizeof(bmpFileHeader));
_lread(fp,@bmpInfoHeader,sizeof(BITMAPINFOHEADER));
//FileRead(fp,bmpInfoHeader,sizeof(BITMAPINFOHEADER)); // tmp_buf:= nil; if (nFrames=0) then
begin
AVIFileOpen(pFile,PChar(Filedest),OF_WRITE or OF_CREATE,nil);
FillMemory(@StreamInfo,sizeof(StreamInfo),0);
StreamInfo.fccType:=streamtypeVIDEO;
StreamInfo.fccHandler := 0;
StreamInfo.dwScale := 1;
StreamInfo.dwRate := 15; // 15 fps
StreamInfo.dwSuggestedBufferSize := bmpInfoHeader.biSizeImage ;
SetRect(StreamInfo.rcFrame, 0, 0, bmpInfoHeader.biWidth, bmpInfoHeader.biHeight);
{hr :=} AVIFileCreateStream(pFile,ps,StreamInfo);
end; getmem(tmp_buf,bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3);
//SetLength(tmp_buf,bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3); _lread(fp,tmp_buf,bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3);
//FileRead(fp,tmp_buf,bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3);
{hr :=} AVIStreamSetFormat(ps,nFrames,@bmpInfoHeader,sizeof(bmpInfoHeader)); {hr :=} AVIStreamWrite(ps, // stream
nFrames , // time of this frame
1, // number to write
tmp_buf,
bmpInfoHeader.biSizeImage , // size of this frame
AVIIF_KEYFRAME, // flags....
Nil,
Nil);
nFrames:=nFrames+1;
freemem(tmp_buf);
_lclose(fp);
//FileClose(fp);
//freemem(tmp_buf);
end;
end;
if (ps<>nil) then
begin
AVIStreamClose(ps);
end; if (pfile <> nil) then
begin
AVIFileRelease(pfile);
end;//tmp_buf:=nil;
AVIFileExit();
end;
各位兄弟劳神看一下,如果有现成的代码,发过来参考一下就感激不尽了
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货