150分求“每秒抓超过7次的整屏图像到文件中(仅800*600*16M色就可以了)”(50分)

老赵:bmp到内存缓冲的时间没有算上.
 
继续讨论,该问题是有代表意义的!!!
 
反正在抓屏,压缩,传输这三个步骤上,目前我发现的是抓屏最慢,
是个瓶颈......有什么好办法?????
 
to xwings:
你得快点做出来啊!大家都在等你呢!好象你说是用directx吧!如果源程序太多的话就发mail吧!
maming_hn@163.com
 
我也有[:)]
但是太[:D]。。。。。。
 
to xwings:
快发email过来吧!分数还可以加!
 
关注
wind2000@21cn.com
 
我也等着!!!!!!!!!!!!!
xxhsh@263.net
 
没做过这方面的测试
关注 [:)]
 
不能只关注啊.......[8D]
 
powergameboy@sina.com
我也需要啊.
 

1. 请高手们发招啊!!!

2. 请同志们不要忘了“把问题提前”啊!!!
 
我觉得抓屏、压缩、保存这三个步骤都和硬件环境有关,

特别是抓屏,甚至和操作系统有关。低档的显卡或兼容型性不好的显卡抓屏质量肯定不好,
因为抓屏实际上会读显卡(不知是否正确,CANVAS好像是设备无关的,但DX应该是)。
压缩和保存实际上就看压缩了,一个1024x768x24bit的屏幕BMP格式为2.3MB左右,压缩成
JPG为100K-200K,GIF等大致为200k就肯定可以了,所以保存需要的时间不多,压缩算法
要好。
 
我现在的程序用的是delphix 800×600x 16bit 没有其他颜色支持了 :)

目前没有使用网络传输, 就是用一个窗体显示一下而已. 使用关键帧和RLE 压缩后,
加上显示的时间 速度如下
400x300 20fps
640x480 12fps
800x600 8fps
刚好满足要求 )
不过很多地方可以优化的,
桌面正常使用的情况下(不看VCD 只是上上网 , 写写程序 , 打打字之类的啦)
数据量大小是 800x600 下 最小100 - 200 Kb/s
最大 900-1200 Kb/s
平均大约 300-500 Kb /s

正在完善中....
 
说了这么一大片东西,,没人讲点实质性的东西..真可惜,
 
我也在等! kundeng@sina.com
 
以下程序抄来并经过修改,可在本机上实时截屏(包括realplay播放),谁把他用winsocket
写成远程监视程序?

unit directxzp;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DXDraws, StdCtrls, DXClass,DIB,DirectX, DXPlay;

type
TForm1 = class(TForm)
DXDraw1: TDXDraw;
DXTimer1: TDXTimer;
procedure DXDraw1InitializeSurface(Sender: TObject);
procedure DXDraw1FinalizeSurface(Sender: TObject);
procedure FormClose(Sender: TObject;
var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure DXTimer1Timer(Sender: TObject;
LagCount: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;
FSurface:TDirectDrawSurface;
ScrDC:HDC;
i:Integer;
WW,HH:Integer;
mPos:TPoint;
posX,posY:Integer;

implementation

{$R *.DFM}

procedure TForm1.DXDraw1InitializeSurface(Sender: TObject);
begin

FSurface:=TDirectDrawSurface.Create(DXDraw1.DDraw);
WW:=screen.Height;
HH:=Screen.Width;
FSurface.SetSize(WW,HH);
FSurface.SystemMemory:=true;
fsurface.Fill(0);
ScrDC:=getDC(0);
end;


procedure TForm1.DXDraw1FinalizeSurface(Sender: TObject);
begin

FSurface.Free;
FSurface:=nil;
end;


procedure TForm1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin

DXTimer1.Enabled:=False;
end;


procedure TForm1.FormShow(Sender: TObject);
begin

DXTimer1.Enabled:=True;
end;


procedure TForm1.DXTimer1Timer(Sender: TObject;
LagCount: Integer);
begin

GetCursorPos(mPos);
FSurface.Fill(11);
BitBlt(FSurface.Canvas.Handle,0,0,WW,HH,ScrDC,0,0,SRCCOPY);
FSurface.Canvas.Release;
if DXDraw1.CanDraw then

begin

DXDraw1.Surface.Draw(0,0, Rect(posX,posY,posX+DXDraw1.Width,posY+DXDraw1.Height),FSurface,false);
DXDraw1.Flip;
end;

end;


end.


 
上面的程序只能抓一点点的视频画面的。
 
现在我的程序使用了 关键帧,也就是帧间压缩,我现在用的是xor 然后在RLE 不过
目前数据量还是比较大,还有很多可以优化的余地,如何尽量减少数据量?
大家有没有好一点的建议? 比如图象分块处理,记录变化区域 等等
有见解的说出来听听。有经验的不要保留拉,非常感谢。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
610
import
I
I
回复
0
查看
871
import
I
顶部