轉(zhuǎn)自:http://tech./167/a490677.html 隨著互聯(lián)網(wǎng)的飛速發(fā)展,流媒體技術(shù)的應(yīng)用越來(lái)越廣泛,從網(wǎng)上廣播、電影播放到遠(yuǎn)程教學(xué)以及在線(xiàn)的新聞網(wǎng)站等都用到了流媒體技術(shù)。但現(xiàn)有公開(kāi)文獻(xiàn)所報(bào)道的大多是利用現(xiàn)有的流媒體服務(wù)器來(lái)搭建一個(gè)流媒體服務(wù)系統(tǒng),或者是針對(duì)流媒體數(shù)據(jù)的編碼方式所進(jìn)行的研究。本文對(duì)流媒體服務(wù)器技術(shù)的研究重點(diǎn)在于如何建立一個(gè)服務(wù)器,并且在實(shí)現(xiàn)流媒體傳輸?shù)膬蓚€(gè)基本協(xié)議RTP/RTCP的基礎(chǔ)上構(gòu)建一個(gè)基本的流媒體服務(wù)器。 2流媒體技術(shù)簡(jiǎn)介 2.1“流”的定義 現(xiàn)在網(wǎng)上傳輸視頻、音頻主要有下載(Download)和流式傳輸(Streaming)兩種方式。流式傳輸是連續(xù)傳送視/音頻信號(hào),當(dāng)流媒體在客戶(hù)機(jī)播放時(shí)其余部分在后臺(tái)繼續(xù)下載。流式傳輸有順序流式傳輸(ProgressiveStreaming)和實(shí)時(shí)流式傳輸(RealtimeStreaming)兩種方式。實(shí)時(shí)流式傳輸是實(shí)時(shí)傳送,特別適合現(xiàn)場(chǎng)事件,實(shí)時(shí)流式傳輸必須匹配連接帶寬,這意味著圖像質(zhì)量會(huì)因網(wǎng)絡(luò)速度降低而變差,以減少對(duì)傳輸帶寬的需求。“實(shí)時(shí)”的概念是指在一個(gè)應(yīng)用中數(shù)據(jù)的交付必須與數(shù)據(jù)的產(chǎn)生保持精確的時(shí)間關(guān)系。 在Internet中使用流式傳輸技術(shù)的連續(xù)時(shí)基媒體就稱(chēng)為流媒體,通常也將其視頻與音頻稱(chēng)為視頻流和音頻流。實(shí)現(xiàn)流式傳輸一般都需要專(zhuān)用服務(wù)器和播放器。 2.2流媒體系統(tǒng)組件 流媒體是由各種不同軟件構(gòu)成的,這些軟件在各個(gè)不同層面上互相通信,基本的流媒體系統(tǒng)包含以下3個(gè)組件: 播放器(Player),用來(lái)播放流媒體的軟件。 服務(wù)器(Server),用來(lái)向用戶(hù)發(fā)送流媒體的軟件。 編碼器(Encode),用來(lái)將原始的音頻視頻轉(zhuǎn)化為流媒體格式的軟件。 這些組件之間通過(guò)特定的協(xié)議互相通信,按照特定的格式互相交換文件數(shù)據(jù)。有些文件中包含了由特定編解碼器解碼的數(shù)據(jù),這種編解碼器通過(guò)特定算法壓縮文件的數(shù)據(jù)量。 3流媒體服務(wù)器的基本功能和服務(wù)方式 3.1流媒體服務(wù)器的主要功能 (1)響應(yīng)客戶(hù)的請(qǐng)求,把媒體數(shù)據(jù)傳送給客戶(hù)。流媒體服務(wù)器在流媒體傳送期間必須與客戶(hù)的播放器保持雙向通信(這種通信是必需的,因?yàn)榭蛻?hù)可能隨時(shí)暫?;蚩旆乓粋€(gè)文件)。 (2)響應(yīng)廣播的同時(shí)能夠及時(shí)處理新接收的實(shí)時(shí)廣播數(shù)據(jù),并將其編碼。 (3)可提供其他額外功能,如:數(shù)字權(quán)限管理(DRM),插播廣告,分割或鏡像其他服務(wù)器的流,還有組播。 3.2流媒體服務(wù)器的服務(wù)方式 (1)單播。在客戶(hù)端與媒體服務(wù)器之間建立一個(gè)單獨(dú)的數(shù)據(jù)通道,從1臺(tái)服務(wù)器送出的每個(gè)數(shù)據(jù)包只能傳送給1個(gè)客戶(hù)機(jī)。 (2)組播。在以組播技術(shù)構(gòu)建的網(wǎng)絡(luò)上,允許路由器一次將數(shù)據(jù)包復(fù)制到多個(gè)通道上。 (3)點(diǎn)播與廣播。點(diǎn)播連接是客戶(hù)端與服務(wù)器之間的主動(dòng)的連接,在點(diǎn)播連接中,用戶(hù)通過(guò)選擇內(nèi)容項(xiàng)目來(lái)初始化客戶(hù)端連接,用戶(hù)可以開(kāi)始、停止、后退、快進(jìn)或暫停流。廣播指的是用戶(hù)被動(dòng)地接收流,在廣播過(guò)程中,數(shù)據(jù)包的單獨(dú)一個(gè)拷貝將發(fā)送給網(wǎng)絡(luò)上的所有用戶(hù),客戶(hù)端接收流,但不能控制流。 4構(gòu)建流媒體服務(wù)器 4.1RTP/RTCP協(xié)議簡(jiǎn)介 實(shí)時(shí)傳輸協(xié)議RTP(RealtimeTransportProtocol):是針對(duì)Internet上多媒體數(shù)據(jù)流的一個(gè)傳輸協(xié)議,由IETF(Internet工程任務(wù)組)作為RFC1889發(fā)布。RTP被定義為在一對(duì)一或一對(duì)多的傳輸情況下工作,其目的是提供時(shí)間信息和實(shí)現(xiàn)流同步。RTP的典型應(yīng)用建立在UDP上,但也可以在TCP或ATM等其他協(xié)議之上工作。RTP本身只保證實(shí)時(shí)數(shù)據(jù)的傳輸,并不能為按順序傳送數(shù)據(jù)包提供可靠的傳送機(jī)制,也不提供流量控制或擁塞控制,它依靠RTCP提供這些服務(wù)。 實(shí)時(shí)傳輸控制協(xié)議RTCP(RealtimeTransportControlProtocol):負(fù)責(zé)管理傳輸質(zhì)量在當(dāng)前應(yīng)用進(jìn)程之間交換控制信息。在RTP會(huì)話(huà)期間,各參與者周期性地傳送RTCP包,包中含有已發(fā)送的數(shù)據(jù)包的數(shù)量、丟失的數(shù)據(jù)包的數(shù)量等統(tǒng)計(jì)資料,因此,服務(wù)器可以利用這些信息動(dòng)態(tài)地改變傳輸速率,甚至改變有效載荷類(lèi)型。RTP和RTCP配合使用,能以有效的反饋和最小的開(kāi)銷(xiāo)使傳輸效率最佳化,故特別適合傳送網(wǎng)上的實(shí)時(shí)數(shù)據(jù)。 RTCP主要有4個(gè)功能: (1)用反饋信息的方法來(lái)提供分配數(shù)據(jù)的傳送質(zhì)量,這種反饋可以用來(lái)進(jìn)行流量的擁塞控制,也可以用來(lái)監(jiān)視網(wǎng)絡(luò)和用來(lái)診斷網(wǎng)絡(luò)中的問(wèn)題; (2)為RTP源提供一個(gè)永久性的CNAME(規(guī)范性名字)的傳送層標(biāo)志,因?yàn)樵诎l(fā)現(xiàn)沖突或者程序更新重啟時(shí)SSRC(同步源標(biāo)識(shí))會(huì)變,需要一個(gè)運(yùn)作痕跡,在一組相關(guān)的會(huì)話(huà)中接收方也要用CNAME來(lái)從一個(gè)指定的與會(huì)者得到相聯(lián)系的數(shù)據(jù)流(如音頻和視頻); (3)根據(jù)與會(huì)者的數(shù)量來(lái)調(diào)整RTCP包的發(fā)送率; (4)傳送會(huì)話(huà)控制信息,如可在用戶(hù)接口顯示與會(huì)者的標(biāo)識(shí),這是可選功能。 4.2RTP/RTCP工作過(guò)程 工作時(shí),RTP協(xié)議從上層接收流媒體信息碼流(如H.263),裝配成RTP數(shù)據(jù)包發(fā)送給下層,下層協(xié)議提供RTP和RTCP的分流。如在UDP中,RTP使用一個(gè)偶數(shù)號(hào)端口,則相應(yīng)的RTCP使用其后的奇數(shù)號(hào)端口。RTP數(shù)據(jù)包沒(méi)有長(zhǎng)度限制,它的最大包長(zhǎng)只受下層協(xié)議的限制。 4.3服務(wù)器的算法 服務(wù)器軟件模型主要有兩種,即并發(fā)服務(wù)器和循環(huán)服務(wù)器。循環(huán)服務(wù)器(IterativeServer)是指在一個(gè)時(shí)刻只處理一個(gè)請(qǐng)求的服務(wù)器。 并發(fā)服務(wù)器(ConcurrentServer)是指在一個(gè)時(shí)刻可以處理多個(gè)請(qǐng)求的服務(wù)器。事實(shí)上,多數(shù)服務(wù)器沒(méi)有用于同時(shí)處理多個(gè)請(qǐng)求的冗余設(shè)備,而是提供一種表面上的并發(fā)性,方法是依靠執(zhí)行多個(gè)線(xiàn)程,每個(gè)線(xiàn)程處理一個(gè)請(qǐng)求,從客戶(hù)的角度看,服務(wù)器就像在并發(fā)地與多個(gè)客戶(hù)通信。 由于流媒體服務(wù)時(shí)間的不定性和數(shù)據(jù)交互實(shí)時(shí)性的請(qǐng)求,流媒體服務(wù)器一般采用并發(fā)服務(wù)器算法。本文構(gòu)建了一個(gè)基本的流媒體服務(wù)器,能夠同時(shí)響應(yīng)多個(gè)用戶(hù)的請(qǐng)求,把本地硬盤(pán)流媒體文件或?qū)崟r(shí)數(shù)據(jù)流(H.263格式)發(fā)送給用戶(hù)。在應(yīng)用中,把客戶(hù)分為請(qǐng)求實(shí)時(shí)數(shù)據(jù)的實(shí)時(shí)客戶(hù)和請(qǐng)求文件數(shù)據(jù)的文件客戶(hù)兩類(lèi)。主要算法為: (1)打開(kāi)設(shè)備,分配資源。當(dāng)設(shè)備準(zhǔn)備好時(shí),創(chuàng)建一個(gè)RTP實(shí)時(shí)服務(wù)線(xiàn)程和一個(gè)RTCP實(shí)時(shí)服務(wù)線(xiàn)程。 (2)創(chuàng)建一個(gè)UDP套接字并將其綁定到所提供服務(wù)的地址之上。 (3)反復(fù)調(diào)用接收模塊,接收來(lái)自客戶(hù)的RTCP報(bào)告,根據(jù)其類(lèi)型做出響應(yīng)。對(duì)新實(shí)時(shí)客戶(hù)的請(qǐng)求,把客戶(hù)地址添加到實(shí)時(shí)服務(wù)的客戶(hù)列表中,對(duì)新文件客戶(hù)的請(qǐng)求,則創(chuàng)建一個(gè)新RTP文件服務(wù)線(xiàn)程和一個(gè)新RTCP文件服務(wù)線(xiàn)程;對(duì)已經(jīng)在服務(wù)中的客戶(hù)則根據(jù)RTCP報(bào)告的內(nèi)容調(diào)整服務(wù)。 RTP實(shí)時(shí)服務(wù)線(xiàn)程1:初始化客戶(hù)列表和RTP首部。 RTP實(shí)時(shí)服務(wù)線(xiàn)程2:從設(shè)備讀取媒體數(shù)據(jù),把數(shù)據(jù)發(fā)送給實(shí)時(shí)服務(wù)列表中的客戶(hù)。 RTP實(shí)時(shí)服務(wù)線(xiàn)程3:更新RTP首部和統(tǒng)計(jì)數(shù)據(jù)。 RTP實(shí)時(shí)服務(wù)線(xiàn)程4:計(jì)算延時(shí),重復(fù)第二步。 RTCP實(shí)時(shí)服務(wù)線(xiàn)程1:初始化RTCP首部。 RTCP實(shí)時(shí)服務(wù)線(xiàn)程2:發(fā)送發(fā)送方報(bào)告給實(shí)時(shí)服務(wù)列表中的客戶(hù)。 RTCP實(shí)時(shí)服務(wù)線(xiàn)程3:計(jì)算延時(shí),重復(fù)第二步。 RTP文件服務(wù)線(xiàn)程1:初始化RTP首部。 RTP文件服務(wù)線(xiàn)程2.:從文件讀取媒體數(shù)據(jù),把數(shù)據(jù)發(fā)送給客戶(hù)。 RTP文件服務(wù)線(xiàn)程3:更新已發(fā)送數(shù)據(jù)的統(tǒng)計(jì)信息,為生成發(fā)送方報(bào)告做準(zhǔn)備。 RTP文件服務(wù)線(xiàn)程4:計(jì)算延時(shí),調(diào)整發(fā)送速度,正常情況下開(kāi)始重復(fù)第二步。 RTCP文件服務(wù)線(xiàn)程1:初始化RTCP首部,發(fā)送一個(gè)源描述(SDES)報(bào)文給客戶(hù)。 RTCP文件服務(wù)線(xiàn)程2:根據(jù)已發(fā)送數(shù)據(jù)的統(tǒng)計(jì)信息生成發(fā)送方報(bào)告,發(fā)送給客戶(hù)。 RTCP文件服務(wù)線(xiàn)程3:計(jì)算延時(shí),正常情況下開(kāi)始重復(fù)第一步。 5流媒體服務(wù)器實(shí)現(xiàn)中應(yīng)注意的問(wèn)題 5.1會(huì)話(huà)和流的兩級(jí)分用 一個(gè)RTP會(huì)話(huà)(Session)包括傳給某個(gè)指定目的地對(duì)(DestinationPair)的所有通信量,發(fā)送方可能包括多個(gè)。 而從同一個(gè)同步源發(fā)出的RTP分組序列稱(chēng)為流(Stream),一個(gè)RTP會(huì)話(huà)可能包含多個(gè)RTP流。一個(gè)RTP分組在服務(wù)器端發(fā)送出去的時(shí)候總是要指定屬于哪個(gè)會(huì)話(huà)和流,在接收時(shí)也需要進(jìn)行兩級(jí)分用,即會(huì)話(huà)分用和流分用。只有當(dāng)RTP使用同步源標(biāo)識(shí)(SSRC)和分組類(lèi)型(PTYPE)把同一個(gè)流中的分組組合起來(lái),才能夠使用序列號(hào)(SequenceNumber)和時(shí)間戳(Timestamp)對(duì)分組進(jìn)行排序和正確回放。 并發(fā)服務(wù)器模式要求用多線(xiàn)程來(lái)提供服務(wù),所以多線(xiàn)程的管理十分重要。在本文構(gòu)建的服務(wù)器中,不同客戶(hù)的請(qǐng)求和反饋都由服務(wù)器的主線(xiàn)程處理,由于實(shí)時(shí)數(shù)據(jù)的獨(dú)有性,不同實(shí)時(shí)客戶(hù)可以共用一個(gè)RTP實(shí)時(shí)服務(wù)線(xiàn)程和一個(gè)RTCP實(shí)時(shí)服務(wù)線(xiàn)程,這樣可以大大減小服務(wù)器的負(fù)擔(dān),而每個(gè)文件客戶(hù)由于請(qǐng)求的文件不同,相應(yīng)地對(duì)速度和開(kāi)始時(shí)間的要求都可能不同,所以需要有自己獨(dú)有的RTP文件服務(wù)線(xiàn)程和RTCP文件服務(wù)線(xiàn)程。 RTP服務(wù)線(xiàn)程負(fù)責(zé)把實(shí)時(shí)數(shù)據(jù)流發(fā)送給客戶(hù),RTCP服務(wù)線(xiàn)程根據(jù)RTP線(xiàn)程的統(tǒng)計(jì)數(shù)據(jù),產(chǎn)生發(fā)送方報(bào)告給客戶(hù)。RTP線(xiàn)程和RTCP線(xiàn)程之間通過(guò)一段共享內(nèi)存交互統(tǒng)計(jì)數(shù)據(jù),對(duì)共享內(nèi)存必須設(shè)置互斥體進(jìn)行保護(hù),防止出現(xiàn)錯(cuò)誤讀寫(xiě)。在這種方式下,服務(wù)器可以根據(jù)每個(gè)用戶(hù)的不同請(qǐng)求和具體情況方便地提供不同的服務(wù)。 5.3時(shí)間戳的處理 時(shí)間戳字段是RTP首部中說(shuō)明數(shù)據(jù)包時(shí)間的同步信息,是數(shù)據(jù)能以正確的時(shí)間順序恢復(fù)的關(guān)鍵。時(shí)間戳的值給出了分組中數(shù)據(jù)的第一個(gè)字節(jié)的采樣時(shí)間(SamplingInstant),要求發(fā)送方時(shí)間戳的時(shí)鐘是連續(xù)、單調(diào)增長(zhǎng)的,即使在沒(méi)有數(shù)據(jù)輸入或發(fā)送數(shù)據(jù)時(shí)也是如此。在靜默時(shí),發(fā)送方不必發(fā)送數(shù)據(jù),保持時(shí)間戳的增長(zhǎng),在接收端,由于接收到的數(shù)據(jù)分組的序號(hào)沒(méi)有丟失,就知道沒(méi)有發(fā)生數(shù)據(jù)丟失,而且只要比較前后分組的時(shí)間戳的差異,就可以確定輸出的時(shí)間間隔。 RTP規(guī)定一次會(huì)話(huà)的初始時(shí)間戳必須隨機(jī)選擇,但協(xié)議沒(méi)有規(guī)定時(shí)間戳的單位,也沒(méi)有規(guī)定該值的精確解釋?zhuān)怯韶?fù)載類(lèi)型來(lái)確定時(shí)鐘的顆粒,這樣各種應(yīng)用類(lèi)型可以根據(jù)需要選擇合適的輸出計(jì)時(shí)精度。 在RTP傳輸音頻數(shù)據(jù)時(shí),一般選定邏輯時(shí)間戳速率與采樣速率相同,但是在傳輸視頻數(shù)據(jù)時(shí),必須使時(shí)間戳速率大于每幀的一個(gè)滴答。如果數(shù)據(jù)是在同一時(shí)刻采樣的,協(xié)議標(biāo)準(zhǔn)還允許多個(gè)分組具有相同的時(shí)間戳值。 5.4媒體數(shù)據(jù)發(fā)送速度的控制 由于RTP協(xié)議沒(méi)有規(guī)定RTP分組的長(zhǎng)度和發(fā)送數(shù)據(jù)的速度,因而需要根據(jù)具體情況調(diào)整服務(wù)器端發(fā)送媒體數(shù)據(jù)的速度。對(duì)來(lái)自設(shè)備的實(shí)時(shí)數(shù)據(jù)可以采取等時(shí)間間隔訪(fǎng)問(wèn)設(shè)備緩沖區(qū),在有新數(shù)據(jù)輸入時(shí)發(fā)送數(shù)據(jù)的方式,時(shí)間戳的設(shè)置相對(duì)容易。對(duì)已經(jīng)錄制好的本地硬盤(pán)上的媒體文件,以H.263格式的文件為例,由于文件本身不包含幀率信息,所以需要知道錄制時(shí)的幀率或者設(shè)置一個(gè)初始值,在發(fā)送數(shù)據(jù)的時(shí)候找出發(fā)送數(shù)據(jù)中的幀數(shù)目,根據(jù)幀率和預(yù)置值來(lái)計(jì)算時(shí)延,以適當(dāng)?shù)乃俣劝l(fā)送數(shù)據(jù)并設(shè)置時(shí)間戳信息。 5.5多種流同步 RTCP的一個(gè)關(guān)鍵作用就是能讓接收方同步多個(gè)RTP流,例如:當(dāng)音頻與視頻一起傳輸?shù)臅r(shí)候,由于編碼的不同,RTP使用兩個(gè)流分別進(jìn)行傳輸,這樣兩個(gè)流的時(shí)間戳以不同的速率運(yùn)行,接收方必須同步兩個(gè)流,以保證聲音與影像的一致。 為能進(jìn)行流同步,RTCP要求發(fā)送方給每個(gè)傳送一個(gè)唯一的標(biāo)識(shí)數(shù)據(jù)源的規(guī)范名(CanonicalName),盡管由一個(gè)數(shù)據(jù)源發(fā)出的不同的流具有不同的同步源標(biāo)識(shí)(SSRC),但具有相同的規(guī)范名,這樣接收方就知道哪些流是有關(guān)聯(lián)的。而發(fā)送方報(bào)告報(bào)文所包含的信息可被接收方用于協(xié)調(diào)兩個(gè)流中的時(shí)間戳值。發(fā)送方報(bào)告中含有一個(gè)以網(wǎng)絡(luò)時(shí)間協(xié)議NTP(NetworkTimeProtocol)格式表示的絕對(duì)時(shí)間值,接著RTCP報(bào)告中給出一個(gè)RTP時(shí)間戳值,產(chǎn)生該值的時(shí)鐘就是產(chǎn)生RTP分組中的TimeStamp字段的那個(gè)時(shí)鐘。由于發(fā)送方發(fā)出的所有流和發(fā)送方報(bào)告都使用同一個(gè)絕對(duì)時(shí)鐘,接收方就可以比較來(lái)自同一數(shù)據(jù)源的兩個(gè)流的絕對(duì)時(shí)間,從而確定如何將一個(gè)流中的時(shí)間戳值映射為另一個(gè)流中的時(shí)間戳值。 流媒體技術(shù)的應(yīng)用日益廣泛,對(duì)流媒體技術(shù)的研究具有很大的實(shí)際意義,本文通過(guò)對(duì)RTP/RTCP協(xié)議的研究,分析流媒體服務(wù)器的一般功能和結(jié)構(gòu),給出構(gòu)建一個(gè)基本的流媒體服務(wù)器的實(shí)現(xiàn)方案,實(shí)驗(yàn)證明可以同時(shí)滿(mǎn)足多個(gè)實(shí)時(shí)和文件客戶(hù)的要求,并已經(jīng)應(yīng)用于一個(gè)遠(yuǎn)程監(jiān)控系統(tǒng)中。
|
|
來(lái)自: MikeDoc > 《視頻技術(shù)》