全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1986
推到 Plurk!
推到 Facebook!

如何將stream切成數個stream用 idudp傳jpeg檔

答題得分者是:Jasonwong
frog1
一般會員


發表:25
回覆:40
積分:18
註冊:2007-01-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-04-02 20:11:13 IP:219.86.xxx.xxx 訂閱
Hi, 各位前輩
我要由一部電腦將萬劃素的JPEG傳到另一部並PLAY出來, 我用IDUDPClient/Server來作,源碼如下
但遇到二個問題, 請那位仁兄可以協助我修改解決

1.JPEG的封包太大, 每次只傳不到1/10, 有找過其他的討論, 說要切割封包, 可是不會做, 請指導
2.做檔案壓縮, 可是一壓檔案大小就為零

//接收端, 收到後PLAY, 但只PLAY整張圖1/10不到
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding : TIdSocketHandle);
Var Jpeg : TJpegImage;
begin
Try
JPeg := TJpegImage.Create;
Jpeg.LoadFromStream(AData);
Image1.Picture.Bitmap.Assign(Jpeg);
Jpeg.Free;
Except
End;
end;
//傳送端, 固定時間作業
procedure TForm1.Timer1Timer(Sender: TObject);
Var Jpeg : TJpegImage;
MemStream : TMemoryStream;
begin
MemStream := TMemoryStream.Create;
Jpeg := TJpegImage.Create;
Try
Jpeg.LoadFromFile('c:\RealTime.Jpg');
Except
End;
Jpeg.CompressionQuality := 10;
Jpeg.JPEGNeeded;
// Jpeg.Compress; -->如執行壓縮MemStream.Size 就為零, 接收端就無任何圖像
Image2.Picture.Bitmap.Assign(Jpeg);
Jpeg.SaveToStream(MemStream);
IdUDPClient1.BroadcastEnabled := True;
If MemStream.Size > IdUDPClient1.BufferSize Then
IdUDPClient1.SendBuffer('192.168.100.101',9001,MemStream.Memory^,IdUDPClient1.BufferSize)
Else
IdUDPClient1.SendBuffer('192.168.100.101',9001,MemStream.Memory^,MemStream.Size);
MemStream.Free;
end;

Jasonwong
版主


發表:49
回覆:931
積分:581
註冊:2006-10-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-04-02 22:04:39 IP:61.57.xxx.xxx 未訂閱
之前有做過續傳的程式, 我現在是憑印象來說明, 說的不對敬請見諒

1.再宣告一個 MemoryStream2
2.用迴圈將檔案切割(如十等份)
3.用 MemoryStream2.CopySize Method

以上
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心
傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-04-03 12:04:00 IP:210.22.xxx.xxx 訂閱
1、你不需要判断   If MemStream.Size > IdUDPClient1.BufferSize Then
按你写法如果图片比BufferSize大,就只能传递BufferSize大小,就你看到的1/10.只用MemStream.Size。

2、一次传太多,协议会自己分包,但成功率比较低,在接受端,只要有一个包错误就全部没有了。而自己组包就比较随便,每个分包都可以用。
------
江上何人初见月,江月何年初照人
frog1
一般會員


發表:25
回覆:40
積分:18
註冊:2007-01-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-04-03 20:42:53 IP:219.86.xxx.xxx 訂閱
Hi,
感謝Jason 及 mustapha兩位的指點, 可是小弟還是未能完全解決
1.不用If MemStream.Size > IdUDPClient1.BufferSize Then可能是MemStream.Size太大了, 接收端完全接收不到任何資料
2.如把stream切成10個, 是否需在每個stream前加視別碼, 以利接收端重新組合, 但要如何再stream上加減資料, 及接收端如何重新組合, 還是困擾著小弟, 煩請再給小弟指點


系統時間:2024-05-04 20:37:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!