標籤:即時通訊 音視頻 音視頻開發 視訊交談 android平台
網路資訊化的趨勢,隨著流媒體技術、無線網路技術以及視頻壓縮技術的不斷進步,視頻監控技術得到了廣泛的應用,同時,監控的規模和範圍也在不斷的擴大。人們對於安全保障的要求不斷的提高,從而使得過去以圖文為主的內容服務應經不能夠滿足使用者的需求,取而代之的則是音視頻多媒體服務。使用移動終端技術的視頻監控系統,不僅具有體積小型化、安裝傻瓜化以及配置靈活化的優勢,最重要的是還降低了成本。由於網路功能和視頻壓縮都被集中的儲存在小體積的裝置中,因此,通過網路遠程監控視頻裝置就可以獲得監控視頻。目前,網路視頻監控不僅面向企業級客戶,逐漸的,也通過視頻監控為福士提供服務。如旅遊景點人流、景點查看、交通導航等。基於開放平台的移動視頻監控已經成為監控研究領域的熱點
視頻監控系統需要的傳輸資料分為兩類:控制資訊和視頻資料。儘管兩類資料進行傳輸的時候都是基於IP協議進行的,但是,他們分別採取了應用程式層協議和傳輸層協議,這是由於兩者的特性要求和實現軟體的規模不同引起的[3]:第一,採用TCP傳輸層協議進行資訊控制。之所以採用TCP/IP的傳輸模式進行資訊控制,這是由於控制資訊雖然不要求較高的即時性,但是對於傳輸的可靠性要求卻十分高。因此,採用了有嚴格握手過程和重傳機制的TCP傳輸層協議。第二,傳輸視頻資料時,採用RTP應用程式層協議和UDP傳輸層協議。由於網路視頻的時效性要求遠遠高於可靠性,因此,本文採用了RTP應用程式層的傳輸協議支援即時傳輸服務。在傳輸層,雖然UDP盡量採用交付方式進行出資料轉送,但是卻沒有擁塞控制,從而對於大資料量的即時視頻資料比較適合此方式,因此,本論文採用UDP協議作為傳輸層協議。接收到上層應用程式的多媒體資訊碼流後,經過RTP裝配成資料包發送給下層,然後在通過UDP/IP協議封裝後形成RTP流。傳輸控制子系統是基於RTP協議構建的,通過傳輸層通訊使用的UDPSocket完成。
在PC機上完成了對視頻監控系統應用程式的開發,主要採用圖片接收方式來實現移動平台的智能視頻監控系統。
伺服器端的功能主要是初始化網路攝影機和網路連接埠號碼以及主機地址,開啟視頻監控服務,即時捕捉監控現場映像然後等待用戶端的串連請求[4]。與遠程請求的手機用戶端成功建立串連後,便開始向用戶端發送視頻映像資訊。伺服器端的設計流程圖2所示。負責現場監控的Pc伺服器端,需要對監控裝置進行初始化控制,採用Visual Studio編程環境下的c++/MFC語言來實現。在進行網路通訊傳輸時,系統是基於RTP協議構建的,通過傳輸層通訊使用的UDPSocket來實現伺服器端和用戶端之間的通訊,以實現映像穩定傳輸。Socket通訊的部分通過MFC語言中的CSocket類來實現,而網路攝影機映像採集和控制則利用相應服務廠商提供的SDK進行實現。視頻的捕獲中,設計了CCaptureVideo類,並將其實現,通過對開啟視頻響應函數中該類的調用來實現對視頻的捕捉。在處理捕獲的視頻映像時,將捕獲的視頻映像轉換成連續的JPEG格式的映像儲存在資料緩衝區中,該線程不停地接受用戶端的串連請求,將映像發送給用戶端。
該視頻監控系統的用戶端主要通過TCP/IP協議和伺服器端進行實施通訊的,同時利用Socket實現整個過程。作為通訊鏈控制代碼的Socket網路通訊通訊端用於描述連接埠和IP地址。通過Socket編程,應用程式會向網路發出請求或應答網路請求。Socket作為通訊的基石,支援TCP/IP協議的網路通訊的基本操作單元。本程式中使用的Socket傳輸模式,是連線導向的Socket操作使用TCP協議。Socket在該模式下,必須在用戶端和服務端建立Socket串連,一旦建立好串連,便可以在一個流介面進行開啟、讀、寫以及關閉等操作,而另一端則以相同的順序接受所有的資訊。相比無串連而言,雖然連線導向的操作效率較低,但資料卻具有更高的安全性。基於Android視頻伺服器系統終端,必須通過採用Socket網路通訊技術接受來自監控前端的視頻資料。Socket通訊使得監控前端和終端,通過網路連接實現資料的互動。Socket串連初始化後才能進行Socket通訊,其實現過程與連線導向的Socket通訊相同。建立Socket服務線程,當產生監聽後,服務主進程負責不斷迴圈的監聽接收到的請求,同時建立新的客戶串連Socket,建立針對此Socket的通訊進程。在視頻監控系統中建立Socket的過程,首先用ServerSocket serverSocket=null在伺服器端建立一個Socket,然後用serverSocket=newServerSocket(8888)監聽連接埠8888。如果在該連接埠接收到用戶端Socket的請求,則用Socket client=serverSocket.accept()來建立一個Socket對象。建立串連後,調用InputStreamReader來接收伺服器端發送的視頻資料,然後通過BufferedReader將此資料讀取出來。伺服器從前端採集系統接收的資料通過BufferedWriter寫入,並通過OutputStreamWriter發送給網路用戶端。通訊完畢之後,通過os.close()、is.close()和socket.close()來關閉輸出輸入資料流並關閉Socket連接埠,伺服器停止Socket通訊。網路用戶端終端作為接收資料的用戶端,首先用Socket socket=null在終端建立一個Socket,然後設定Socket通訊的伺服器的IP地址和通訊連接埠socket=new Socket("192.168.1.101",8888),成功與伺服器建立串連後,用InputStreamReader建立輸入資料流,之後通過BufferedReader讀取出來,進行解析並顯示在使用者端介面上,資料接收完畢後,通過BufferedWriter寫入接收完畢資訊並通過OutputStreamWriter發送至伺服器,通訊完畢後,通過os.close()、is.close()、socket.close()關閉輸入輸出資料流,並關閉Socket連接埠,至此整個Socket通訊完成。
由於伺服器發送的是解碼後的圖片資料,因而用戶端接收到的資料流可以組成一幅圖片[5-6]。通過Android提供的BitmapFactory.decodeByteAllrayO函數,可以從接收到的資料流中得到Bitmap格式的對象。後文的處理皆針對此Bitmap對象進行。
為了實現監控畫面的顯示,需繼承View類,重寫了onDraw()方法。其中,在onDraw()方法中所實現的內容,將在用戶端介面上顯示出來。定義一個Bitmap對象,此對象將在畫布中繪製出來。當負責接收圖片的線程接收到新的圖片資料時,將資料傳給該對象,並線上程中調用postlnvalidate0方法,重繪畫面。為了系統實現更好的顯示效果,本設計採用了雙緩衝機制。顯示的畫面儲存在原先對象中,而接收的畫面儲存在變數另一對象中。如果網路狀況不好,並不能及時接收到新的資料,使得另一對象為空白,則原先的變數不更新,還將顯示之前的畫面,這樣處理將在一定程度上提高使用者體驗,減少網路狀況不好情況下的突發性黑屏。
根據Android的GUI系統,能夠實現遠程視頻即時監視的使用者介面,並提供播放器和使用者之間的互動介面。Java和C語言架構共同組成了GUI系統,此系統對下層通過調用顯示輸入、輸出裝置的驅動,將Android的軟體系統和底層的硬體聯絡起來;此系統對於上層提供了Java層次的繪圖介面,Android的Java架構層調用這些介面來構建各種UI元素。此外,Java也可以調用繪圖介面。
手機端的音視頻監控系統開發