用delphi做实时流问题好不好?
我现在要做一个ip可视电话的实现
不知道用delphi做方便不
高手指教
问题点数:0、回复次数:14Top
1 楼lizongqi(英雄啊)回复于 2003-02-01 17:41:29 得分 0
看看我们公司的产品 用delphi作的
www.pancool.comTop
2 楼lovermaple(风)回复于 2003-02-02 10:34:21 得分 0
大哥,我不是要买这个东西,是要自己做,找不到技术方面得东西啊,
我毕业设计做这个,没办法啊,
Top
3 楼gqg2001(老牛)回复于 2003-02-07 22:26:53 得分 0
我也在研究这个问题。我现在做了个测试程序,还可以在局域网中调试过了
。我的目标是用modem拨号上网也能用,不过还没有最后调试。
音频压缩使用了ACM,以GSM格式压缩,音频数率为2K/s,视频我采用间歇发送
jpg图象的方式。当然,都是用Delphi完成的。Top
4 楼Gracezmhb(格子)回复于 2003-02-21 15:42:37 得分 0
我也需要用到流的实时传输,请问你有没有关于这方面的书,用的什么控件?
老牛,我也尝试采用间歇发送jpg图象的方式发送视频,但是总是出问题,能不能给点帮助?Top
5 楼stephenhuyuanzhang(追日者)回复于 2003-02-22 10:52:26 得分 0
我正想做一个与流相关的开发,需要这方面的资料,望各位指教。Top
6 楼Gracezmhb(格子)回复于 2003-02-24 19:32:42 得分 0
to gqg2001(老牛) :
把在客户机接受到的流房子一个缓冲区,然后显示在Image空间中,系统总是报错,EJpeg Class JPeg 52#。
你碰到过这种情况吗?怎么解决?麻烦告诉我一下啦Top
7 楼tonylk(=www.tonixsoft.com=)回复于 2003-02-24 19:41:55 得分 0
楼上的,一般是数据接收不完整造成的,简单的做法加入except段屏蔽该错误,一般情况下jpeg图象还是可以正常显示的,有可能底部话出现解码错误。Top
8 楼whuzengcheng(阿真)回复于 2003-02-24 21:40:23 得分 0
我在将jpg格式文件存到access数据库中的ole属性字段'picture'中,但是图片已经存进去了,显示时居然提示找不到picture字段,不知道为什么?图片显示代码如下(在dbimage控件中显示,不过无法显示出来,不知为何):
var
tempstream:TStringStream;
tempjpeg:TJPEGImage;
begin
try
tempstream:=TStringStream.Create('');
TBlobField(adotable1.FieldByName('picture')).SaveToStream(tempstream);
tempstream.Position:=0;
tempjpeg:=TJPEGImage.Create;
tempjpeg.LoadFromStream(tempstream);
DBImage1.Picture.Bitmap.Assign(tempjpeg);
finally
tempstream.Free;
tempjpeg.Free;
end;
end;
运行时还提示savetostream为undeclared identifier,不知为什么?请高手赐教!
Top
9 楼Gracezmhb(格子)回复于 2003-02-25 13:44:23 得分 0
to tonylk(tony) :
我也这样做过:用了try ...except...end
try
MyStream.Position := 0;
JPEGImage.LoadFromStream(MyStream);
ImageIn.Picture.Assign(JPEGImage);
sleep(10);
except
end;
但是为了做到实时,每秒要接受20帧,时间间隔很短。由于Image的大部分都是花屏,只有上面的三分之一可以看到。
这怎么办呢?急死了!Top
10 楼tonylk(=www.tonixsoft.com=)回复于 2003-02-25 22:50:06 得分 0
你做的从数据库读取再显示的这断函数是放在哪里的?不会是在timmer中吧。。。比较理想的做法是在线程中处理数据的读取,然后通过synchronize来显示。如果这样还是有问题,可以认为的加一点sleep()。
另外,你用数据库来处理图象的快速显示感觉不是很合理,可以优化一下,做两个缓存,轮流使用,读取数据到缓存1时,显示缓存2中内容,同样,读取2时显示缓存1中内容。Top
11 楼Gracezmhb(格子)回复于 2003-02-26 11:49:04 得分 0
to tonylk(tony) :
我没有用数据库,有两个程序,一个是服务器,另一个是客户机,用了ClientSocket和ServerSocket两个控件。服务器的摄像头拍下的图像以bmp的格式先放在一个Image控件里,然后将它变成Jpeg的格式。客户机建立连接后,每隔50ms发送一个请求,要求发送图片,然后接受,接受的数据放在一个buffer里,然后用Image显示出来。这是我的思路。程序如下:
服务器:
try
MyStream:=TMemoryStream.Create;
VideoIn.EditCopy; //获得摄像头的照片
ImageIn.Picture.Bitmap.LoadFromClipboardFormat (cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0);
JPEGImage:= TJPEGImage.Create;
JPEGImage.CompressionQuality:=95;
JPEGImage.Assign(ImageIn.Picture.Bitmap);
JPEGImage.SaveToStream(MyStream);
n:=MyStream.Size;
Edit1.Text:=InttoStr(n);
MyStream.Position:=0;
Socket.SendStream(MyStream);
finally
MyStream.Free;
JPEGImage.Free;
end;
客户机:
try
MyStream:=TMemoryStream.Create;
JPEGImage:=TJPEGImage.Create;
Flag := False;
while true do
begin
nReceived := Socket.ReceiveBuf (Buffer, sizeof (Buffer));
if nReceived <= 0 then
begin
Break;
end
else
begin
MyStream.Write (Buffer, nReceived);
Flag := True;
sleep(1);
end;
end;
if Flag = true then
begin
try
MyStream.Position := 0;
JPEGImage.LoadFromStream(MyStream);
ImageIn.Picture.Assign(JPEGImage);
sleep(10);
except
end;
end;
Finally
JPEGImage.Free;
MyStream.Free;
End;
总是出现Jpeg error #52的错误,我想也是数据接受不完整的缘故吧。可是我是个新手,对synchronize, 双缓存也不是很懂,麻烦你费心,多指导一下,行吗?我还有很多分,如果需要可以给你很多
我的qq:43164814
Top
12 楼tonylk(=www.tonixsoft.com=)回复于 2003-02-26 20:25:01 得分 0
我觉得你这段代码有致命的错误,你的客户端在接受数据时,怎么知道当前完整的接收完一张图片的所有数据了呢?要知道TCP/IP的数据传输当你在server端发送一个大数据时,client端接收到数据可能会分好机此,就是说,你在客户端的OnReceiveData()中的函数也许一次收到的只是server端发送的数据中的部分。
所以我一般这样做,自定义一个数据结构,并有一个数据头,用来标志这个数据宝的id号,server端将大数据分成小的数据包分别发送,client端收到数据后按照索引号组装起来,放在缓存里,最后一个包到达后再将这块数据解码,显示。
你的这个问题不是jpeg解码的问题,而是网络数据传输的问题,这方面我不是很熟,你最好再区域问一下别人。。。
Top
13 楼tonylk(=www.tonixsoft.com=)回复于 2003-02-26 20:26:54 得分 0
把你邮箱给我,我发能比一个我以前做的基于udp的jpeg传输程序。Top
14 楼tonylk(=www.tonixsoft.com=)回复于 2003-02-26 20:29:28 得分 0
忘说了,我的邮箱:tonyki@citiz.netTop




