• 沒有找到結果。

Set up source file

第四章 多媒體串流系統與 RTP 封裝演算法

4.3 Set up source file

「RTSP 信息溝通協調」主要負責伺服端和客戶端間連線溝通,在 這階段中會解析RTSP 信息封包,主要由 incomingRequestHandler1() 來解析出客戶端送出的要求,並呼叫相關處理函式,相關程序流程可以 參考figure4.2;在此關於來源檔案的建立、解析器與封包包裝格式的選

擇以及「封包包裝與傳送」模組的啟動主要來自於“DESCRIBE”和

“PLAY”的請求。Table4.3 中簡單說明了 RTSP 信息模式,在下面二個 小節會在對“DESCRIBE”和“PLAY”作進一步說明。

Table4.3 RTSP Method

RTSP 信息 簡要說明 TCP/UDP socket的關閉動作。

4.3.1 handleCmd_DESCRIBE ( )

客戶端利用“DESCRIBE”向伺服端要求播放影音檔案的詳細描述 資訊,當伺服端接受這個請求後,會執行handleCmd_DESCRIBE( ),

其處理的事項可以參考figure4.4 的流程。handleCmd_DESCRIBE ( ) 一開始會先讀取用戶端要求播放的影音檔案檔名,抓取檔案名稱字串中 的副檔名部份比對出相應的處理程序,以test.m4v 為例,會對映到 MPEG4VideoFileServerMediaSubsession 此一處理程序,這表示之後 整個串流程序中對檔案的處理由它來做統籌,在這個處理程序中主要包

含了檔案的存在與否的確認及開啟,以及解析器和RTP 封包包裝模式 選用與啟動。

Figure4.4 handleCmd_DESCRIBE ( ) Flow Chart

當選擇好處理程序後,接下來伺服端要傳送關於檔案的相關資訊給 客戶端,此時會以SDP 協定描述的方式將資訊放在封包中傳送,因此 會呼叫generateSDPDescription ( )來產生關於描述多媒體會議

(session)的文字檔,而 generateSDPDescription( )會呼叫 sdpLines( ),

sdpLines( )在此階段中是一個重要的程序,主要處理的事項為進入一開 始所選擇好的處理程序:MPEG4VideoFileServerMediaSubsession 中,

依序進行:

建立stream source–createNewStreamSource ( ):

(1.) 利用 fopen( )開啟準備串流的檔案,此時只是利用 fid 這 個指標告訴伺服端檔案是否存在以及檔案所存放的位 置;並沒有將檔案內容讀入到伺服端的輸入緩衝區中。

(2.) 啟動相應的解析器,完成其初始化,在此所啟動的解析 器為MPEG4VideoStreamFramer::parse ( );並且經由 呼叫StreamParser ( )執行建置輸入緩衝區 fCurBank。

建立RTP 封包包裝的相關環境-createNewRTPSink( ):

主要因應所選檔案類型啟動相應的 RTP 封包包裝環境,並 在啟動的過程中回傳多媒體會議(session)描述文字檔中所需要 的訊息,像是:rtpPayloadType、rtpTimestampFrequency、

rtpPayloadFormmatName…等;在此所啟動的 RTP 封包包裝 環境為:MPEG4ESVideoRTPSink,回傳的訊息中像是

rtpPayloadType 為 96、rtpTimestampFrequency 等於 90000 與 rtpPayloadFormmatName 是"MP4V-ES"。另外,會先預先 建置或設定下列各項:

(1.) setPacketSizes( )-RTP 封包大小設定:

包含 RTP header 所允許傳送的 RTP 封包大小範圍為 1000~1448 bytes,最大值限制為 1448 bytes,也就是說封包 大小超過1448 bytes 便須要對 frame 進行切割處理。

c. Sequence Number (4.) Special case :

如果串流的媒體檔案的編碼語法結構中包含了組態資訊 (configuration information),像是 MPEG-4ES,則在此會先 執行startPlaying( )中的 continuePlay ( )進入「RTP 封包包裝 與傳送」模組,最主要的目地是要進入 parse( )內先行解析出 檔案資料的組態資訊回送給客戶端,並不是真正開始要傳送 RTP 封包,先行解析出的組態資訊會同時放入一個暫存的記憶

體空間和輸出緩衝區中,回傳訊息時是由暫存的空間拿取資料 進行傳送,而在輸出緩衝區的資料會在等到收到客戶端傳送

“PLAY”請求後才啟用。

假如串流的媒體檔案包含了音訊與視訊,比如MPEG-2 檔案,則會為視訊流和音訊流各自建置解析器與RTP 相關環 境,並且也會建立兩個輸出緩衝區將音訊流與視訊流各別放 入,因此在「封包包裝與傳送」模組運作上能輕易的辨認目前 裝載的資料類型,進而設定RTP header 的欄位。

4.3.2 handleCmd_PLAY ( )

客戶端透過傳送“PLAY"這個訊息向伺服端請求開始傳送封包,當 伺服端接受“PLAY"這個請求時,會執行 handleCmd_PLAY ( )。

handleCmd_PLAY ( )會呼叫 startStream( )來處理伺服端要回應給客 戶端的訊息資訊,它會將Sequence Number 和 Timestamp 的初始值回 傳給客戶端,並會執行startPlaying( )中的 continuePlay ( ),代表要開 始傳送封包,也表示從「RTSP 信息協調溝通」進入到「封包包裝與傳 送」的階段。