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

X

xwings

Unregistered / Unconfirmed
GUEST, unregistred user!
to CaoWei

我的传输不是RTP .是借用了RTP的思想的UDP而已.

至于你说的"抓屏的速度和显卡硬件有很大关系,不同的显卡速度差别很大。" 我倒是想听听你的见解.
因为我现在还没有发现特别慢和特别快的显卡.
"最简单的检测可以使用本帧和上帧进行XOR操作" 你说的这句话我倒是很赞同.但是在显存中的数据如何xor呢?
既然已经保存在本地内存了,这时候占用cpu一定很高了.
有个现象就是. 如果bitlblt屏幕到一个canvas速度是很快的. 我想数据还是保存在显存中的缘故吧.
 
J

jingtao

Unregistered / Unconfirmed
GUEST, unregistred user!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1347908
谁解决了我就代码谁:)
 
W

wql

Unregistered / Unconfirmed
GUEST, unregistred user!

to xwings &
caowei:
辛苦您们了!

1. 我个人认为抓屏幕主要在LAN监控时象NetMeeting一样鼠标点击后屏幕的反映延迟
很小就可以了。
2. 采用xwings的rle算发压缩速度快,没采用directx的采集速度也还满意。
3. 传输时采用udp,每笔最大2048字节,我测试了在连续发送最多5次数据,对方的
接受程序可以处理,但是超过5次,对方就会丢包,在800*600*256色时可能有0.5s
的延迟。我的意思是如何可以连续接受更多的UDP包,这样屏幕就几乎没有延迟了。

算法:
发送端:
1. 得到图象(处理关键贞)。
2. RLE压缩关键贞--->Buffer。
3. For I:=1 To 5{UDP连续发送的次数}do

NMUDP.发送Buffer[当前的UDP数据]

接受端:
1. 接受当前UDP数据。 -----> 是否可以象WinSocketStream一样建立线程处理?
会不会处理时间过长又丢失UDP包呢?
2. If 接受次数=5 then

请求下一笔UDP数据
3. If 所有数据接受完毕
处理关键桢,显示图象,请求下一副图象

还望俩位回涵,先谢了!
 
C

caowei

Unregistered / Unconfirmed
GUEST, unregistred user!
不能按照“接收-处理-接收”这样的顺序。
应该建立一个线程专门接收,放到队列里,另外一个线程专门处理。
 
C

caowei

Unregistered / Unconfirmed
GUEST, unregistred user!
不能按照“接收-处理-接收”这样的顺序。
应该建立一个线程专门接收,放到队列里,另外一个线程专门处理。
 
W

wql

Unregistered / Unconfirmed
GUEST, unregistred user!
我的意思就是在UDP的接受触发中:
1.建立线程。
2.线程中UDP.ReadBuffer读UDP数据。

问题是:
1.线程中读到的数据是否是本次Recive的UDP数据?
2.是否回丢包?
 
X

xwings

Unregistered / Unconfirmed
GUEST, unregistred user!
TO:WQL
呵呵,这个问题可以再开一个帖子来讨论了.
你说的问题
1.读到的肯定是本次receive的包.否则就不会触发UDP的read事件了.
2.不管丢包还是不丢包.丢包处理一定要做的. 做法无非就是加标记了.
 
X

xwings

Unregistered / Unconfirmed
GUEST, unregistred user!
我的做法就是

抓屏线程--->压缩线程.--> 发送线程. 每个线程的行为是阻塞的. 例如发送没有发送完毕.压缩就不会压缩.
接受类似 接受线程-->buffer-->数据包整理-->buffer-->解码--->显示.
 
W

wql

Unregistered / Unconfirmed
GUEST, unregistred user!
假如UDP数据顺序编号:U1,U2,U3...
你的接受线程是象Socket线程一样临时建立的吗?

如果是的话线程启动后UDP.ReadBuffer确实读到的是本次的Ui(i=1...)吗?会不会
顺序错乱.

Procedure UDPDataRecevied();
begin

//本次传来数据Ui(i=1....)
建立线程;
退出;

end;


Procedure 线程.Execute;
begin

FreeOnTerminated:=True;

UDP.ReadBuffer确实读到的是本次的Ui(i=1...)吗?
end;

 
W

wql

Unregistered / Unconfirmed
GUEST, unregistred user!
刚才发送出现:“脚本超时。。。”,不知道各位收到没有,所以重发,看到
的朋友情帮忙提前!


假如UDP数据顺序编号:U1,U2,U3...
你的接受线程是象Socket线程一样临时建立的吗?

如果是的话线程启动后UDP.ReadBuffer确实读到的是本次的Ui(i=1...)吗?会不会
顺序错乱.

Procedure UDPDataRecevied();
begin

//本次传来数据Ui(i=1....)
建立线程;
退出;

end;


Procedure 线程.Execute;
begin

FreeOnTerminated:=True;

UDP.ReadBuffer确实读到的是本次的Ui(i=1...)吗?
end;

 
X

xwings

Unregistered / Unconfirmed
GUEST, unregistred user!
线程一开始就已经建立好了的.然后接受的时候只管放到一个buffer队列. 线程只负责处理buffer队列中的
数据包. 如果在一定范围内乱序的话.由线程负责处理.
 
H

Haofei

Unregistered / Unconfirmed
GUEST, unregistred user!
我们可以利用计算机的特点:屏幕上的内容变化比较小,一般只有局部变化,如鼠标的
移动、菜单的弹出等。因此我们可以将屏幕分成若干个区域并编号,然后每取一屏即与前一
屏的相应块比较,若相同则放弃此块,若有差异则保存帧号、块号及块的内容。

不过你得自己开发一个播放器。其实很多CAI课件都是用这个原理做的。
 
M

METALLEE

Unregistered / Unconfirmed
GUEST, unregistred user!
如果实在没有可行的方法请问谁知道哪里有远程监控的ocx或者dll出售?效果要能和VNC相媲美
反正公司出钱````*^_^*
 
M

mjy97

Unregistered / Unconfirmed
GUEST, unregistred user!
to metallee:
我有解决方案。
mjyemail@sina.com
 
T

tohappy

Unregistered / Unconfirmed
GUEST, unregistred user!
关注下列问题,一定对你有益:
http://delphibbs.com/delphibbs/dispq.asp?lid=1743719
http://delphibbs.com/delphibbs/dispq.asp?lid=1742072
http://delphibbs.com/delphibbs/dispq.asp?lid=1655569
http://delphibbs.com/delphibbs/dispq.asp?lid=1786356
 
W

wql

Unregistered / Unconfirmed
GUEST, unregistred user!
远程监控倒是简单,但是效果要能和VNC相媲美恐怕就有点那个....
因为连RemoteControl的效果都没有xings在上面提供的算法好!嘿嘿!
 

Similar threads

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