2007年5月5日 星期六

隨意桌面,數位溝通

下載

軟體名稱:Ad Hoc Desktop
軟體版本:v 1.0.0
軟體大小:450 KB
軟體作者:cuteofdragon
軟體授權:免費軟體
發佈時間:2007/05/06

背景概述
在行動裝置和數位家庭娛樂的旋風席捲全球下,人與人之間透過網路溝通的機會也大幅度的提升;MSN Messenger、SKype等即時通訊軟體提供豐富和多樣性的需求,從單純的文字傳訊到語音聊天和最後的視訊會議,清楚地突顯出一種重要的概念-「數位溝通」。

在視訊會議普及的數位時代中,人們目前依然停留在人與人之間的溝通與互動,對於人與人和電腦之間的三方溝通缺乏有效的機制,也就是說人們無法透過眼前電腦螢幕的表現即時的告訴遠在另一端的朋友,像是會議簡報內容、行車電子地圖、軟體操作等;因此要是有一個「隨意桌面」的概念讓這樣的理想實現,那數位溝通將更能具體實現遠大的一句話:「電腦將無所不在」。
軟體導覽

為了在數位時代實現數位溝通的理想,為了在網路世界創造隨意桌面的情境,本軟體運用新一代Microsoft .NET 2.0解決方案實現「隨意桌面,數位溝通」的理想,透過群組會議進行將桌面、視訊和語音一次雙向的傳送給所有的群組成員,運用TCP Socket、DirectSound和InteropServices技術讓數位溝通無遠弗屆。其中,TCP Socket傳送/接收序列化 串流資料,DirectSound提供語音錄製/播放功能,InteropServices連接Win32 API和COM元件將桌面序列化傳送。

本軟體實現「隨意桌面,數位溝通」中創造了前所未見的數位時代溝通模式,人們可以視桌面為個人在網路上溝通的代理人,無論是在家、學校或是出外工作,皆可以隨時隨地的傳送您的代理人。在現今寬頻網路普及下,本軟體對於頻寬的限制亦相當重視,在隨意桌面傳送過程,平均每秒只需要30kbytes,這是因為本軟體實作螢幕比對、畫面壓縮和語音壓縮等技術,意味著「隨意桌面,數位溝通」的可行性、創新性和未來性。

TCP Socket
使用System.Net.Sockets.TcpListener傾聽串流伺服器168連接埠,運用封包轉送原理將用戶端欲傳送的隨意桌面畫面轉送給邀請的另一個用戶端,即不需考慮兩地之間的防火牆限制。在畫面傳送時,撰寫System.Net.Sockets.Socket動態地產生AdHocDesktop_TcpObject物件,接收桌面和語音原始byte陣列,並使用System.Net.Sockets.NetworkStream進行物件序列化,物件序列化使用 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter。為了有效地減少資料量,本軟體撰寫螢幕比對原理和畫面及語音的壓縮,使隨意桌面在傳送期間,每秒平均為30kbytes,符合寬頻網路需求。

在螢幕比對原理為將螢幕緩衝的畫面(如何取得螢幕緩衝詳見InteropService說明)以System.Drawing.Bitmap物件觀看,然後取出System.Drawing.Imaging.BitmapData,隨即可取得一維原始byte陣列,並根據Bitmap影像規格BGR原理進行比對。首先先取得一張比對依據影像,接下來取得的影像和前一張比對,相同的byte設為0。對於每一張影像的byte陣列採用System.IO.Compression.GZip壓縮;在另一端取得影像後,根據前一張完整影像進行影像重建,其減少傳送頻寬資料原理即相同byte設為0時,使用GZip即可有效地減少資料的儲存。在語音的壓縮亦使用GZip進行壓縮(如何取得語音緩衝詳DirectSound說明)。

DirectSound
採用Microsoft.DirectX.DirectSound.CaptureBuffer取得語音緩衝,Microsoft.DirectX.DirectSound.SecondaryBuffer進行語音播放,CaptureBuffer和SecondaryBuffer採用環狀緩衝方式實作,也就是說緩衝區為一固定大小,而存在二個指標,一個指向當前讀取/寫入的位置,另一個指向下一次寫入/讀取的位置,當抵達緩衝區結尾時即回到緩衝區開頭。

由於緩衝必需由其他執行緒取得,在即時資料傳送時必需使用Microsoft.DirectX.DirectSound.Notify和Microsoft.DirectX.DirectSound. BufferPositionNotify,透過定位CaptureBuffer/SecondaryBuffer緩衝區在讀取/寫入第n個索引時進進行執行緒回呼,並定義回呼方法,詳細實作細節詳見程式碼。

InteropService
透過System.Runtime.InteropServices.DllImport定義呼叫Win32 API的靜態方法,其中GetDesktopWindow()、GetDC()為取得桌面獨一無二Handle,根據CreateCompatibleDC()、CreateCompatibleBitmap()將Handle所指向的螢幕緩衝區轉換成HBitmap指標,最後透過System.Drawing.Graphics將HBitmap轉換成System.Drawing.Bitmap物件,完成螢幕緩衝取得。

軟體需求
作業軟體 相容Microsoft Windows XP SP2
相依套件 Microsoft .NET Framework 2.0
Microsoft DirectX 9.0c
硬體需求 CPU:Pentium IV 以上相容等級
記憶體:512 MB 以上
硬碟空間:8 GB 以上
選擇配備 視訊攝影機
音效卡 / 麥克風

安裝執行
  1. 解壓縮AdHocDesktop_v1.0.0.zip。
  2. 需由一台電腦執行AdHocDesktop.StreamServer.exe開啟隨意桌面串流伺服器,並確認本機運行此軟體電腦的網路IP位址,例如:192.168.1.2。
  3. 欲進行隨意桌面傳送時,在別台電腦執行AdHocDesktop.User.exe開啟隨意桌面用戶端,並輸入隨意串流伺服器網路IP位址。
  4. 接著進行登入,帳號密碼可任意輸入。
  5. 開始啟動隨意桌面傳送。

隨意桌面傳送示意圖



原文下載

本軟體榮獲2006微軟潛能創意盃台灣區軟體設計組 第三名。

4 則留言:

谁染枫林醉 提到...

你好,看了你这篇帖子及源码,收获不小,我想引用一下其中的一些源码来发一些帖子,主要也是为了学习directsount,希望能得到你的许可,另外关于directx有些不明白的地方,是否可以咨询你。谢谢,我的邮件是onlytiancai@gmail.com

陳勤達 提到...

當然可以,如果對你有幫助的話,非常樂意看到你的來信或是彼此交流,謝謝。

安静的小强 提到...

你好,在网上找.net音频传输的资料找了好久,今天终于找到了。一看软件的设计思路,就知道错不了。自己虽然也在刻意的研究directx,但始终是收益不多。
在网页上找了半天,只找到了编译后的文件,能否把源码发到我的邮箱里,我将万分感谢。我的邮箱是caizhifei2003@163.com

陳勤達 提到...

lucifer 你好:
關於音頻傳輸的相關資料可以參閱下列網址,有更詳進的說明,謝謝。
http://www.cnblogs.com/onlytiancai/archive/2008/08/02/p2p_sound_chat.html