Dephi实现屏幕录像.docx

上传人:b****5 文档编号:11568679 上传时间:2023-03-19 格式:DOCX 页数:14 大小:17.03KB
下载 相关 举报
Dephi实现屏幕录像.docx_第1页
第1页 / 共14页
Dephi实现屏幕录像.docx_第2页
第2页 / 共14页
Dephi实现屏幕录像.docx_第3页
第3页 / 共14页
Dephi实现屏幕录像.docx_第4页
第4页 / 共14页
Dephi实现屏幕录像.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

Dephi实现屏幕录像.docx

《Dephi实现屏幕录像.docx》由会员分享,可在线阅读,更多相关《Dephi实现屏幕录像.docx(14页珍藏版)》请在冰豆网上搜索。

Dephi实现屏幕录像.docx

Dephi实现屏幕录像

Dephi实现屏幕录像

delphi利用VFW函数实现录制屏幕的功能:

1.通过Timer实现抓屏,将屏幕抓图存为BMP格式。

2.调用AVIFileInit初始化

3.调用AVIFileOpen创建视频文件

4.调用AVIFileCreateStream创建视频流

5.调用AVIMakeCompressedStream压缩视频流

6.调用AVIStreamSetFormat设置视频流格式

7.调用AVIStreamWrite写入视频

8.调用AVIStreamClose关闭视频流指针,AVIFileRelease释放视频文件,AVIFileExit关闭视频文件。

源码:

1.抓屏存为BMP

//抓屏幕,Flag=SRCCOPY,不抓透明窗口,Flag=SRCCOPYorCAPTUREBLT抓透明窗口

//CAPTUREBLT要自己定义

//const

//{$ifndefCAPTUREBLT}

//CAPTUREBLT=$40000;

//{$endif}

var

ScreenBmp:

TBitmap;

PicIndex:

Integer;//图片序号

RecTransFlag:

Cardinal;//录制屏幕标志,是否录制透明窗体

AppPath:

string;//应用程序路径

TempPath:

string;//临时文件夹路径BmpFileName:

string;//BMP文件存储路径procedureTForm

1.FormCreate(Sender:

TObject);

begin

PicIndex:

=0;

BmpFileName:

='';

ScreenBmp:

=TBitmap.Create;

ScreenBmp.PixelFormat:

=pf24bit;

ScreenBmp.Width:

=Screen.Width;

ScreenBmp.Height:

=Screen.Height;

ScreenBmp.Canvas.Brush.Style:

=bsClear;

RecPause:

=False;

//不录制透明窗体

RecTransFlag:

=SRCCOPY;

//录制透明窗体

//RecTransFlag:

=SRCCOPYorCAPTUREBLT;

AppPath:

=ExtractFilePath(Application.ExeName);

TempPath:

=AppPath+'Temp\';

ifnotDirectoryExists(TempPath)then

CreateDirectory(PAnsiChar(TempPath),nil);

end;

procedureTForm

1.DrawCursorToBmp(varScrBmp:

TBitmap);

var

hCur:

HICON;

MousePt:

TPoint;

begin

ifnotAssigned(ScrBmp)then

Exit;

hCur:

=GetCursor();

GetCursorPos(MousePt);

//画光标

DrawIcon(ScrBmp.canvas.handle,MousePt.x,MousePt.y,hCur);end;

procedureTForm

1.Timer1Timer(Sender:

TObject);

var

dc:

HDC;

begin

DC:

=GetDC

(0);

try

BitBlt(ScreenBmp.Canvas.Handle,0,0,Screen.Width,Screen.Height,dc,0,0,Flag);

finally

ReleaseDC(0,dc);

end;

//根据标记判断是否画上光标

DrawCursorToBmp(ScreenBmp);

BmpFileName:

=TempPath+IntToStr(PicIndex)+'.bmp';

ScreenBmp.SaveToFile(BmpFileName);

end;

try

Inc(PicIndex);

except

onEIntOverflowdo

end;

procedureTForm

1.Button1Click(Sender:

TObject);

begin

timer

1.Enabled:

=True;

end;

2.取保存的bmp图片生成avi并添加声音.

usesVFW;

var

AviFileName:

string;//AVI文件存储路径Tempbmp:

TBitmap;//生成AVI前读出的BMPfunctionGetBitmapData(bmp:

TBitmap):

TImageData;

begin

bmp.PixelFormat:

=pf24bit;

Result.Width:

=bmp.Width;

Result.Height:

=bmp.Height;

Result.Stride:

=Result.Widthshl2;

Result.Scan0:

=bmp.ScanLine[Result.Height-1];

Result.PixelFormat:

=-1;//Windowsbitmapformatflag

Result.Reserved:

=0;

end;

procedureCreateAVI;

var

hr:

Integer;

Strhdr:

TAVIStreamInfo;//AVI流信息

Wavehdr:

TWaveFormatEx;

Opts:

TAVICOMPRESSOPTIONS;//压缩选项

POpts:

PAVICOMPRESSOPTIONS;//压缩选项指针

Bi:

BITMAPINFOHEADER;//BMP头信息

B:

Boolean;

P:

Pointer;

i:

Integer;

bmpData:

TImageData;

nRet:

Integer;

begin

ifFileExists(AviFileName)then

DeleteFile(AviFileName);

AVIFileInit;

hr:

=AVIFileOpen(PFile,PChar(AviFileName),OF_CREATEorOF_WRITE,nil);

if(hr<>0)then

Exit;

//设置AVI流信息

ZeroMemory(@Strhdr,SizeOf(TAVIStreamInfo));

strhdr.fccType:

=streamTypeVIDEO;

strhdr.fccHandler:

=mmioFOURCC('D','I','V','X');

strhdr.dwFlags:

=0;

strhdr.dwCaps:

=0;

strhdr.wPriority:

=0;

strhdr.wLanguage:

=0;

strhdr.dwScale:

=1;

strhdr.dwRate:

=5;//pfs

strhdr.dwStart:

=0;

strhdr.dwLength:

=0;

strhdr.dwInitialFrames:

=0;

strhdr.dwSuggestedBufferSize:

=((Screen.Width*3+3)and$FFFC)*screen.Height;//Screen.Height*screen.Width*3;

strhdr.dwQuality:

=0;

strhdr.dwSampleSize:

=1;

strhdr.rcFrame:

=Rect(0,0,Screen.Width,Screen.Height);strhdr.dwEditCount:

=0;

strhdr.dwFormatChangeCount:

=0;

strhdr.szName[0]:

=#0;

strhdr.szName[1]:

=#0;

//设置WAV流信息

ZeroMemory(@Wavehdr,SizeOf(TWaveFormatEx));

Wavehdr.cbSize:

=0;

Wavehdr.nChannels:

=1;

Wavehdr.wFormatTag:

=1;

Wavehdr.wBitsPerSample:

=16;

Wavehdr.nSamplesPerSec:

=8000;

Wavehdr.nBlockAlign:

=Wavehdr.wBitsPerSample*Wavehdr.nChannelsdiv8;

Wavehdr.nAvgBytesPerSec:

=Wavehdr.nBlockAlign*

Wavehdr.nSamplesPerSec;

ZeroMemory(@opts,SizeOf(TAVICOMPRESSOPTIONS));

//设置压缩信息

//Indeo?

Video

5.10

opts.fccType:

=streamTypeVIDEO;//vids

opts.fccHandler:

=9;

opts.dwKeyFrameEvery:

=0;

opts.dwQuality:

=8500;

opts.dwBytesPerSecond:

=0;

opts.dwFlags:

=8;

opts.lpFormat:

=nil;

opts.cbFormat:

=0;

opts.cbParms:

=48;

opts.dwInterleaveEvery:

=0;

//设置BMP头信息

ZeroMemory(@bi,SizeOf(BITMAPINFOHEADER));

bi.biSize:

=SizeOf(bi);

bi.biWidth:

=Screen.Width;

bi.biHeight:

=Screen.Height;

bi.biPlanes:

=1;

bi.biBitCount:

=24;

bi.biCompression:

=0;

bi.biSizeImage:

=((Screen.Width*3+3)and$FFFC)*screen.Height;//(((bih.biWidth*3)+3)&0xFFFC)*bih.biHeight//Screen.Height*screen.Width*3;//_stride*_height;

bi.biXPelsPerMeter:

=0;

bi.biYPelsPerMeter:

=0;

bi.biClrUsed:

=0;

bi.biClrImportant:

=0;

hr:

=AVIFileCreateStream(PFile,PSrcStream,@strhdr);

if(hr<>0)then

Exit;

hr:

=AVIMakeCompressedStream(PCompStream,PSrcStream,@opts,nil);if(hr<>0)then

Abort;

hr:

=AVIStreamSetFormat(PCompStream,20,@bi,40);

if(hr<>0)then

Abort;

Tempbmp:

=TBitmap.Create;

Tempbmp.LoadFromFile(bmpFile);

bmpData:

=GetBitmapData(Tempbmp);

hr:

=AVIStreamWrite(PCompStream,

FrameCount,//存在第几帧

1,

bmpData.Scan0,

((Screen.Width*3+3)and$FFFC)*screen.Height,

0,

nil,

nil);

if(hr<>0)then

Abort;

//添加声音

AddAVISound;

end;

end;

procedureAddAVISound;

var

wfx:

TWAVEFORMATEX;

buf:

arrayofchar;

wav:

PWavChunk;

hf:

HWND;

size:

DWORD;

Strhdr:

TAVIStreamInfo;

hr:

Cardinal;

numbytes,numsamps:

DWORD;

begin

ZeroMemory(@wfx,sizeof(TWAVEFORMATEX));

hf:

=CreateFile(PChar(WavFileName),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);

if(hf=0)then

Exit;

try

size:

=GetFileSize(hf,nil);

SetLength(buf,size);

ReadFile(hf,buf[0],size,size,nil);

finally

CloseHandle(hf);

end;

wav:

=PWavChunk(buf);

wfx.wFormatTag:

=wav.fmt.wFormatTag;

wfx.cbSize:

=0;

wfx.nAvgBytesPerSec:

=wav.fmt.dwAvgBytesPerSec;

wfx.nBlockAlign:

=wav.fmt.wBlockAlign;

wfx.nChannels:

=wav.fmt.wChannels;

wfx.nSamplesPerSec:

=wav.fmt.dwSamplesPerSec;

wfx.wBitsPerSample:

=wav.fmt.wBitsPerSample;

ZeroMemory(@Strhdr,SizeOf(TAVIStreamInfo));

Strhdr.fccType:

=streamtypeAUDIO;

Strhdr.dwScale:

=wfx.nBlockAlign;

Strhdr.dwRate:

=wfx.nSamplesPerSec*wfx.nBlockAlign;

Strhdr.dwSampleSize:

=wfx.nBlockAlign;

Strhdr.dwQuality:

=DWORD(-1);

hr:

=AVIFileCreateStream(PFile,PWavStream,@Strhdr);

if(hr<>0)then

begin

if(buf<>nil)then

buf:

=nil;

Exit;

end;

hr:

=AVIStreamSetFormat(PWavStream,0,@wfx,SizeOf(TWAVEFORMATEX));if(hr<>0)then

begin

if(buf<>nil)then

buf:

=nil;

Exit;

end;

//nowwecanwritethedata

numbytes:

=wav.dat.size;

ifwfx.wBitsPerSample<>0then

numsamps:

=numbytes*8divwfx.wBitsPerSample

else

numsamps:

=0;

hr:

=AVIStreamWrite(PWavStream,0,numsamps,wav,numbytes,0,nil,nil);

if(buf<>nil)then

buf:

=nil;

if(hr<>0)then

Exit;

WavAddCompleted:

=True;

end;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1