• 沒有找到結果。

Client 端程式運作流程

第四章 利用雙相機做物體平面座標定位

6.4 Client 端程式運作流程

在章節 6.2 裡,介紹了監控平台的 Client/Server 端的使用者介面 及相關的使用說明。進一步地,將介紹這些使用者介面是如何透過相關 軟體程式達到所提供的功能。下面將介紹 Client 端的程式運作流程:

圖 6-4-1 Client 端程式運作流程

圖 6-4-1 為 Client 端的程式運作流程,描述著 Client 端主要的程 式運作。以下將依序介紹各程式區塊的功用:

當 Client 端的使用者按下 button 〝Open〞時,會執行 Member Function Onstart()內的程式碼。首先會透過 StreamCreateClient() 函 式 建 構 出 建 立 RTSP Connection 所 需 的 物 件 , 接 著 會 利 用 StreamOpenConnection()建立 RTSP Connection 並發出 PLAY Method 給

Server,告知欲進行影像檔案播放的動作,接著等待 Server 端傳送過 來的 Video/Audio data。

接 著 會 開 啓 VideoStatusTimeFunc() 、 AudioStatusTimeFunc() Thread 負 責 處 理 Video 及 Audio 資 料 。 二 Thread 會 分 別 呼 叫 StreamGetVideoFrame()、StreamGetAudioFrame()函式取得 Client 端 Buffer 內的 Video 及 Audio 資料,接著再透過個別的解碼器 decore1()、

decore2()解碼出 RGB 影像及聲音訊號。接著會將 RGB 影像交給 Image Processing() Thread 進行影像處理的動作,搭配事先所定義的錄影機 制及相機切換機制,根據影像處理的結果決定是否要執行錄影的動作或 相機的切換。如要錄影可呼叫 StreamRecord()函式,此函式會藉由 PING Message 的使用來告知 Server 端進行錄影的動作。如要進行相機的切換 動作時,可呼叫 StreamCamera()函式告知 Server 端進行相機切換的動 作。

上述為整個 Client 端程式運算流程的簡短說明,以下將針對主要 的程式區塊進行詳細的說明:

[StreamOpenConnection]

圖 6-4-2 StreamOpenConnection()程式流程

圖 6-4-2 為 StreamOpenConnection()函式的內部程式運作流程圖。

函式一開始會執行 open()函式,此函式會呼叫 ConnectRTSPServer() 函 式,ConnectRTSPServer()會透過 ConnectToStreamingServer()函式建 立及測試 Client/Server 二端的 TCP Connection 是否連線正常。如 TCP Connection 連線正常的話,Client 端會藉由 SendDescribeRequest() 函式發出 RTSP 的 Describe Message 給 Server 端以取得取得 Media Data 的相關描述。有了 Media Data 的相關訊息之後,便知道 Media Server 所處位置。接著透過 SendSetupRequest()函式發出 Setup Message 和

Server 端進行連線的設定動作。接著透過 SendPlayRequest()函式發出 Play Message 給 Server 端,告知欲進行影像檔案的播放動作。

[StreamGetVideoFrame、decore1]

圖 6-4-3 StreamGetVideoFrame、decore1 程式流程

圖 6-4-3 為 StreamGetVideoFrame、decore1 函式的程式運作流程 圖 。 首 先 , StreamGetVideoFrame 函 式 會 呼 叫 GetVideoFrame() , GetVideoFrame()函式會進一步的呼叫 GetFrame()。GetFrame()函式會 將 Client 端 收 到 的 RTP Packet 組 合 成 MP4 資 料 並 儲 存 於 FrameBitstreamBufferLinklistHead Buffer 裡,接著會進行 memory copy 的動作,將此 Buffer 內的 MP4 資料複製到所指定 ucBuffer 裡。當

有了 MP4 檔案之後,便可利用 MP4 Decoder decore1()進行解碼的動作,

解碼後的檔案格式為 RGB Format 的影像資料。

[StreamRecord]

圖 6-4-4 StreamRecord 程式流程

當我們針對影像資料進行影像處理的運算時,處理後的結果可能會 符合事先定義的事件情況,因此可能要對此時的影像進行錄影的動作,

此時可呼叫 StreamRecord()函式通知 Server 端告知錄影的動作,詳細 程式運作流程如圖 6-4-4 所示。

StreamRecord() 函 式 會 先 呼 叫 SendRecordCmd() 函 式 , SendRecordCmd()函式會再去呼叫 send_hello_request()函式,接著將 錄影訊息字串〝a=FeedBack:01〞塞入 PING Message 裡,PING Message 包 裝 好 之 後 , 交 給 SendBuffer() 函 式 , SendBuffer() 再 呼 叫

SendSocketTCP()函式,SendSocketTCP()再透過 Send()函式將此 PING Message 送到 TCP Socket 傳輸。當 Server 端經由 TCP Socket 接收到此 包含錄影訊息字串的 PING Message 時,會知道 Client 端要求錄影的動 作,並執行錄影動作。

[StreamCamera]

圖 6-4-5 StreamCamera 程式流程

當我們對影像資料進行影像處理的運算時,有時可能會因某種應用 的要求而需要有不同的相機影像,因此 Server 端傳送給 Client 端的相 機影像需要適時的切換。因此 Client 端可利用 StreamCamera()函式告 知 Server 端進行相機的切換動作。詳細程式運作流程如圖 6-3-5 所示。

StreamRecord() 函 式 會 先 呼 叫 SendCameraCmd() 函 式 , SendCameraCmd()函式會再去呼叫 send_hello_request()函式,接著將 Client 端想要切換的相機訊息字串〝a=Camera:i〞塞入 PING Message 裡,PING Message 包裝好之後,交給 SendBuffer()函式,SendBuffer() 再呼叫 SendSocketTCP()函式,SendSocketTCP()再透過 Send()函式將 此 PING Message 送到 TCP Socket 傳輸。當 Server 端經由 TCP Socket 接收到此包含相機訊息字串的 PING Message 時,會依所隱藏的相機訊 息切換傳送給 Client 端的相機影像。

相關文件