利用NMUDP傳送影像所產生的錯誤.. |
尚未結案
|
cceCKF
一般會員 發表:13 回覆:13 積分:5 註冊:2004-04-05 發送簡訊給我 |
想請教板上的先進:
小弟使用NMUDP來傳送影像,處理的過程先利用VFW偵測並擷取視訊圖片,將擷取的圖片分割成三部份並轉成JPEG格式,再分別傳送,每秒約佔5K頻寬!!在學校的網路環境測試效果還算可以,不過有個蠻嚴重的問題,就是大約過五分鐘以後,便會出現錯誤訊息,某一端程式就會當掉..由於板上大多使用Indy原件,因此找不到相關解決方法。下面是部分程式片段:
/*分割並傳送圖片(Timer每0.2秒執行一次)/ Graphics::TBitmap *Source= new Graphics::TBitmap; Graphics::TBitmap *Source2= new Graphics::TBitmap; Graphics::TBitmap *Source3= new Graphics::TBitmap; TRect rect = ClientRect; TCanvas *MyCanvas= new TCanvas; HDC dc = GetDC(hCapWnd); MyCanvas->Handle = dc; Source->Width = 160; Source->Height = 40; Source->Canvas->CopyRect(Rect(0,0,160,40),MyCanvas,Rect(0,0,160,40)); Source->PixelFormat=pf24bit; Source2->Width = 160; Source2->Height = 40; Source2->Canvas->CopyRect(Rect(0,0,160,40),MyCanvas,Rect(0,40,160,80)); Source2->PixelFormat=pf24bit; Source3->Width = 160; Source3->Height = 40; Source3->Canvas->CopyRect(Rect(0,0,160,40),MyCanvas,Rect(0,80,160,120)); Source3->PixelFormat=pf24bit; TJPEGImage* JPG=new TJPEGImage(); JPG->CompressionQuality=60; JPG->Assign(Source); TJPEGImage* JPG2=new TJPEGImage(); JPG2->CompressionQuality=60; JPG2->Assign(Source2); TJPEGImage* JPG3=new TJPEGImage(); JPG3->CompressionQuality=60; JPG3->Assign(Source3); TMemoryStream *ms1=new TMemoryStream; TMemoryStream *ms2=new TMemoryStream; TMemoryStream *ms3=new TMemoryStream; JPG->SaveToStream(ms1); JPG2->SaveToStream(ms2); JPG3->SaveToStream(ms3); ms1->Position=0; ms2->Position=0; ms3->Position=0; NMUDP1->SendStream(ms1); NMUDP2->SendStream(ms2); NMUDP3->SendStream(ms3); ms1->Free(); ms2->Free(); ms3->Free(); /*接收部分*/ TMemoryStream *rms1=new TMemoryStream; NMUDP1->ReadStream(rms1); TJPEGImage* RJPG1=new TJPEGImage(); RJPG1->LoadFromStream(rms1); Graphics::TBitmap *rpic1= new Graphics::TBitmap; rpic1->Width = 160; rpic1->Height = 40; rpic1->Assign(RJPG1); Form5->PaintBox1->Canvas->Draw(0,0,rpic1); rms1->Free(); RJPG1->Free(); rpic1->Free(); TMemoryStream *rms2=new TMemoryStream; NMUDP2->ReadStream(rms2); TJPEGImage* RJPG2=new TJPEGImage(); RJPG2->LoadFromStream(rms2); Graphics::TBitmap *rpic2= new Graphics::TBitmap; rpic2->Width = 160; rpic2->Height = 40 ; rpic2->Assign(RJPG2); Form5->PaintBox1->Canvas->Draw(0,40,rpic2); rms2->Free(); RJPG2->Free(); rpic2->Free(); TMemoryStream *rms3=new TMemoryStream; NMUDP3->ReadStream(rms3); TJPEGImage* RJPG3=new TJPEGImage(); RJPG3->LoadFromStream(rms3); Graphics::TBitmap *rpic3= new Graphics::TBitmap; rpic3->Width = 160; rpic3->Height = 40 ; rpic3->Assign(RJPG3); Form5->PaintBox1->Canvas->Draw(0,80,rpic3); rms3->Free(); RJPG3->Free(); rpic3->Free();請問是哪段程式邏輯不對導致執行上的不正常呢?謝謝各位.. -- 我想多學一點 發表人 -
------
我想多學一點 |
李國維
高階會員 發表:42 回覆:287 積分:235 註冊:2003-02-07 發送簡訊給我 |
|
ralph
初階會員 發表:41 回覆:82 積分:29 註冊:2003-02-04 發送簡訊給我 |
|
cceCKF
一般會員 發表:13 回覆:13 積分:5 註冊:2004-04-05 發送簡訊給我 |
引言: cceCKF: UDP的傳輸時是不會確認資料是否正確的傳達到.並且UDP可以使用廣播的方式將封包同時傳遞給多各Client.不過由於使用廣播傳送時.封包會再網路上停留一段時間.對於網路的負載會造成很大的影響. 所以我個人是建議如果是單純的架構下用TCP會來的比較好. 如果依照下列程式而言你試試看只開啟一各UDP來做傳輸.會不會比較好. 我改寫試看看!! 補充一點.用new所生成的.最好用delete來銷毀 請問該如何做呢?用new產生的並沒有delete這個function可以使用耶> 發表人 - 李國維 於 >>< face="Verdana, Arial, Helvetica"> ..thanks! -- 我想多學一點
------
我想多學一點 |
李國維
高階會員 發表:42 回覆:287 積分:235 註冊:2003-02-07 發送簡訊給我 |
引言:引言: cceCKF: UDP的傳輸時是不會確認資料是否正確的傳達到.並且UDP可以使用廣播的方式將封包同時傳遞給多各Client.不過由於使用廣播傳送時.封包會再網路上停留一段時間.對於網路的負載會造成很大的影響. 所以我個人是建議如果是單純的架構下用TCP會來的比較好. 如果依照下列程式而言你試試看只開啟一各UDP來做傳輸.會不會比較好. 我改寫試看看!! 補充一點.用new所生成的.最好用delete來銷毀 請問該如何做呢?用new產生的並沒有delete這個function可以使用耶> 發表人 - 李國維 於 >>< face="Verdana, Arial, Helvetica"> ..thanks! -- 我想多學一點請問該如何做呢?用new產生的並沒有delete這個function可以使用耶 Graphics::TBitmap *Source= new Graphics::TBitmap; .... delete Source; |
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |