DSS系列:1溶耘、簡(jiǎn)介

概要

Darwin Streaming Server簡(jiǎn)稱(chēng)DSS二拐。DSS是Apple公司提供的開(kāi)源實(shí)時(shí)流媒體播放服務(wù)器程序(QuickTime Streaming Server開(kāi)源版本)。整個(gè)程序使用C++編寫(xiě)凳兵,在設(shè)計(jì)上遵循高性能百新,簡(jiǎn)單,模塊化等程序設(shè)計(jì)原則庐扫,務(wù)求做到程序高效饭望,可擴(kuò)充性好仗哨。并且DSS是一個(gè)開(kāi)放源代碼的,基于標(biāo)準(zhǔn)的流媒體服務(wù)器铅辞,可以運(yùn)行在Windows NT和Windows 2000厌漂,以及幾個(gè)UNIX實(shí)現(xiàn)上,包括Mac OS X斟珊,Linux苇倡,F(xiàn)reeBSD,和Solaris操作系統(tǒng)上的囤踩。

特性

支持MP4旨椒、3GPP等文件格式;
支持MPEG-4堵漱、H.264等視頻編解碼格式综慎;
支持RTSP流控協(xié)議,支持HTTP協(xié)議勤庐;
支持RTP流媒體傳輸協(xié)議示惊;
支持單播和組播;
支持基于Web的管理愉镰;
具有完備的日志功能米罚。
此外,該服務(wù)器版本提供了一個(gè)基于模塊的擴(kuò)展方法岛杀。利用DSS提供的API就可以很方便地編寫(xiě)靜態(tài)或動(dòng)態(tài)的模塊,對(duì)DSS進(jìn)行擴(kuò)展崭孤,使其支持其它文件格式类嗤、協(xié)議或者功能。

框架

核心服務(wù)器通過(guò)創(chuàng)建四種類(lèi)型的線(xiàn)程來(lái)完成自己的工作辨宠,具體如下:

  • 服務(wù)器自己擁有的主線(xiàn)程(Main Thread)遗锣。這個(gè)線(xiàn)程負(fù)責(zé)檢查服務(wù)器是否需要關(guān)閉,記錄狀態(tài)信息嗤形,或者打印統(tǒng)計(jì)信息精偿。
  • 空閑任務(wù)線(xiàn)程(Idle Task Thread)「潮空閑任務(wù)線(xiàn)程管理一個(gè)周期性的任務(wù)隊(duì)列笔咽。該任務(wù)隊(duì)列有兩種類(lèi)型:超時(shí)任務(wù)和套接口任務(wù)。
  • 事件線(xiàn)程(Event Thread)霹期。事件線(xiàn)程負(fù)責(zé)偵聽(tīng)套接口事件叶组,比如收到RTSP請(qǐng)求和RTP數(shù)據(jù)包,然后把事件傳遞給任務(wù)線(xiàn)程历造。
  • 一個(gè)或者多個(gè)任務(wù)(Task)線(xiàn)程甩十。任務(wù)線(xiàn)程從事件線(xiàn)程中接收RTSP和RTP請(qǐng)求船庇,然后把請(qǐng)求傳遞到恰當(dāng)?shù)姆?wù)器模塊進(jìn)行處理,把數(shù)據(jù)包發(fā)送給客戶(hù)端侣监。缺省情況下鸭轮,核心服務(wù)器為每一個(gè)處理器創(chuàng)建一個(gè)任務(wù)線(xiàn)程。

模塊

媒體服務(wù)器使用模塊來(lái)響應(yīng)各種請(qǐng)求及完成任務(wù)橄霉。有三種類(lèi)型的模塊:

  1. 內(nèi)容管理模塊

內(nèi)容管理模塊負(fù)責(zé)管理與媒體源相關(guān)的RTSP請(qǐng)求和響應(yīng)窃爷,比如一個(gè)文件或者一個(gè)廣播。每個(gè)模塊負(fù)責(zé)解釋客戶(hù)的請(qǐng)求酪劫,讀取和解析它們的支持文件或者網(wǎng)絡(luò)源吞鸭,并且以RTSP和RTP的方式進(jìn)行響應(yīng)。在某些情況下覆糟,比如流化mp3的模塊刻剥,使用的則是HTTP。

QTSSFileModule滩字,QTSSReflectorModule造虏,QTSSRelayModule,和QTSSMP3StreamingModule都是內(nèi)容管理模塊麦箍。

2.服務(wù)器支持模塊

服務(wù)器支持模塊執(zhí)行服務(wù)器數(shù)據(jù)的收集和記錄功能漓藕。服務(wù)器模塊包括QTSSErrorLogModule, QTSSAccessLogModule挟裂,QTSSWebStatsModule享钞,QTSSWebDebugModule, QTSSAdminModule诀蓉,和QTSSPOSIXFileSystemModule栗竖。

3.訪(fǎng)問(wèn)控制模塊

訪(fǎng)問(wèn)控制模塊提供鑒權(quán)和授權(quán)功能,以及操作URL路徑提供支持渠啤。
訪(fǎng)問(wèn)控制模塊包括QTSSAccessModule狐肢,QTSSHomeDirectoryModule,QTSSHttpFileModule沥曹,和QTSSSpamDefenseModule份名。

數(shù)據(jù)

當(dāng)一個(gè)模塊需要訪(fǎng)問(wèn)客戶(hù)請(qǐng)求的RTSP報(bào)頭時(shí),可以通過(guò)QTSS.h這個(gè)API頭文件中定義的請(qǐng)求對(duì)象來(lái)訪(fǎng)問(wèn)相應(yīng)的請(qǐng)求信息妓美。舉例來(lái)說(shuō)僵腺,RTSPRequestInterface類(lèi)實(shí)現(xiàn)了API字典元素,這些元素可以通過(guò)API來(lái)進(jìn)行訪(fǎng)問(wèn)壶栋。名稱(chēng)是以“Interface”結(jié)尾的對(duì)象想邦,比如RTSPRequestInterface,RTSPSessionInterface委刘,和QTSServerInterface丧没,則用于實(shí)現(xiàn)模塊的API鹰椒。

下面是重要的接口類(lèi):

  • QTSServerInterface — 這是內(nèi)部數(shù)據(jù)的存儲(chǔ)對(duì)象,在A(yíng)PI中標(biāo)識(shí)為QTSS_ServerObject呕童。在A(yíng)PI中的每一個(gè)QTSS_ServerAttributes都在基類(lèi)中聲明和實(shí)現(xiàn)漆际。
  • RTSPSessionInterace — 這是內(nèi)部數(shù)據(jù)的存儲(chǔ)對(duì)象,在A(yíng)PI中標(biāo)識(shí)為qtssRTSPSessionObjectType夺饲。在A(yíng)PI中的每一個(gè)QTSS_RTSPSessionAttributes都在基類(lèi)中聲明和實(shí)現(xiàn)奸汇。
  • RTPSessionInterface — 這是內(nèi)部數(shù)據(jù)的存儲(chǔ)對(duì)象,在A(yíng)PI中標(biāo)識(shí)為QTSS_ClientSessionObject往声。在A(yíng)PI中的每一個(gè)QTSS_ClientSessionAttributes都在基類(lèi)中聲明和實(shí)現(xiàn)擂找。
  • RTSPRequestInterface — 這是內(nèi)部數(shù)據(jù)的存儲(chǔ)對(duì)象,在A(yíng)PI中標(biāo)識(shí)為QTSS_RTSPRequestObject浩销。在A(yíng)PI中的每一個(gè)QTSS_RTSPRequestAttributes都在基類(lèi)中聲明和實(shí)現(xiàn)贯涎。

源代碼的組織

Server.tproj

這個(gè)目錄包含核心服務(wù)器(core server)的代碼,可以分成三個(gè)子系統(tǒng):

  • 服務(wù)器內(nèi)核慢洋。這個(gè)子系統(tǒng)中的類(lèi)都有一個(gè)QTSS前綴塘雳。QTSServer負(fù)責(zé)處理服務(wù)器的啟動(dòng)和關(guān)閉。QTSServerInterface負(fù)責(zé)保存服務(wù)器全局變量普筹,以及收集服務(wù)器的各種統(tǒng)計(jì)信息败明。QTSSPrefs是存儲(chǔ)服務(wù)器偏好設(shè)定的地方。QTSSModule太防,QTSSModuleInterface妻顶,和QTSSCallbacks類(lèi)的唯一目的就是支持QTSS的模塊API。
  • RTSP子系統(tǒng)蜒车。這些類(lèi)負(fù)責(zé)解析和處理RTSP請(qǐng)求讳嘱,以及實(shí)現(xiàn)QTSS模塊API的RTSP部分。其中的幾個(gè)類(lèi)直接對(duì)應(yīng)QTSS API的一些元素(比如醇王,RTSPRequestInterface類(lèi)就是對(duì)應(yīng)于QTSS_RTSPRequestObject對(duì)象)呢燥。每個(gè)RTSP TCP連接都有一個(gè)RTSP會(huì)話(huà)對(duì)象與之相對(duì)應(yīng)崭添。RTSPSession對(duì)象是一個(gè)Task對(duì)象寓娩,負(fù)責(zé)處理與RTSP相關(guān)的事件。
  • RTP子系統(tǒng)呼渣。這些類(lèi)處理媒體數(shù)據(jù)的發(fā)送棘伴。RTPSession對(duì)象包含與所有RTSP會(huì)話(huà)ID相關(guān)聯(lián)的數(shù)據(jù)。每個(gè)RTPSession都是一個(gè)Task對(duì)象屁置,可以接受核心服務(wù)器的調(diào)度來(lái)進(jìn)行RTP數(shù)據(jù)包的發(fā)送焊夸。RTPStream對(duì)象代表一個(gè)單獨(dú)的RTP流,一個(gè)RTPSession對(duì)象可以和任何數(shù)目的RTPStream對(duì)象相關(guān)聯(lián)蓝角。這兩個(gè)對(duì)象實(shí)現(xiàn)了QTSS模塊API中的針對(duì)RTP的部分阱穗。

CommonUtilitiesLib

這個(gè)目錄含有一個(gè)工具箱饭冬,包括線(xiàn)程管理,數(shù)據(jù)結(jié)構(gòu)揪阶,網(wǎng)絡(luò)昌抠,和文本解析工具。Darwin流媒體服務(wù)器及其相關(guān)工具通過(guò)這些類(lèi)對(duì)類(lèi)似或者相同的任務(wù)進(jìn)行抽象鲁僚,以減少重復(fù)代碼炊苫;這些類(lèi)的封裝簡(jiǎn)化了較高層次的代碼;借助這些類(lèi)還分離了專(zhuān)用于不同平臺(tái)的代碼冰沙。下面是對(duì)目錄下的各個(gè)類(lèi)的簡(jiǎn)短描述:

  • OS類(lèi)侨艾。這些類(lèi)在時(shí)間,條件變量拓挥,互斥鎖唠梨,和線(xiàn)程方面提供了專(zhuān)用于不同平臺(tái)的代碼抽象。這些類(lèi)包括OS撞叽,OSCond姻成,OSMutex,OSThread愿棋,和OSFileSource科展;數(shù)據(jù)結(jié)構(gòu)則包括OSQueue,OSHashTable糠雨,OSHeap才睹,和OSRef。
  • 套接口類(lèi)(Sockets)甘邀。這些類(lèi)為T(mén)CP和UDP網(wǎng)絡(luò)通訊方面提供了專(zhuān)用于不同平臺(tái)的代碼抽象琅攘。通常情況下,套接口類(lèi)是異步的(或者說(shuō)是非阻塞的)松邪,可以發(fā)送事件給Task對(duì)象坞琴。這些類(lèi)有:EventContext,Socket逗抑,UDPSocket剧辐,UDPDemuxer,UDPSocketPool邮府,TCPSocket荧关,和TCPListenerSocket。
  • 解析工具褂傀。這些類(lèi)負(fù)責(zé)解析和格式化文本忍啤。包括StringParser,StringFormatter仙辟,StrPtrLen同波,和StringTranslator鳄梅。
  • Task(任務(wù)):這些類(lèi)實(shí)現(xiàn)了服務(wù)器的異步事件機(jī)制。

QTFileLib

流媒體服務(wù)器的一個(gè)主要特性就是它能夠?qū)⑺饕瓿桑╤inted)的QuickTime電影文件通過(guò)RTSP和RTP協(xié)議提供給客戶(hù)未檩。這個(gè)目錄包含QTFile庫(kù)的源代碼卫枝,包括負(fù)責(zé)解析索引完成的QuickTime文件的代碼。服務(wù)器的RTPFileModule通過(guò)調(diào)用QTFile庫(kù)來(lái)從索引過(guò)的QuickTime文件中取得數(shù)據(jù)包和元數(shù)據(jù)讹挎。QTFile庫(kù)可以解析下面幾種文件類(lèi)型:.mov校赤,.mp4(.mov的一種修改版本),和.3gpp(.mov的一種修改版本)筒溃。

APICommonCode

這個(gè)目錄包含與API相關(guān)的類(lèi)的源代碼马篮,比如moduletils,或者諸如記錄文件的管理這樣的公共模塊函數(shù)怜奖。

APIModules

這個(gè)目錄包含流媒體服務(wù)器模塊目錄浑测,每個(gè)模塊都有一個(gè)目錄。

RTSPClientLib

這個(gè)目錄包含實(shí)現(xiàn)RTSP客戶(hù)端的源代碼歪玲,這些代碼可以用于連接服務(wù)器迁央,只要該連接協(xié)議被支持。

RTCPUtilitiesLib

這個(gè)目錄包含解析RTCP請(qǐng)求的源代碼滥崩。

APIStubLib

這個(gè)目錄包含API的定義和支持文件岖圈。

HTTPUtilitiesLib

這個(gè)目錄包含解析HTTP請(qǐng)求的源代碼。

二次開(kāi)發(fā)模塊添加的要求

每個(gè)DSS模塊必須實(shí)現(xiàn)兩個(gè)函數(shù):一個(gè)是Main函數(shù)钙皮,服務(wù)器在啟動(dòng)時(shí)將調(diào)用這個(gè)函數(shù)進(jìn)行必要的初始化蜂科。另一個(gè)是Dispatch函數(shù),通過(guò)實(shí)現(xiàn)此函數(shù)短条,服務(wù)器可調(diào)用DSS模塊并完成特定處理导匣。對(duì)于編譯到服務(wù)器里面的模塊,其主函數(shù)的地址必須傳遞到服務(wù)器的模塊Main函數(shù)中茸时。

具體實(shí)現(xiàn)時(shí)贡定,Main函數(shù)必須命名為MyModule_Main,其中MyModule是模塊的文件名可都。此函數(shù)的實(shí)現(xiàn)通常如下所示:

QTSS_Error MyModule_Main(void* inPrivateArgs)
{
  return _stublibrary_main(inPrivateArgs, MyModuleDispatch);
}

每個(gè)DSS模塊都必須提供一個(gè)Dispatch函數(shù)缓待。服務(wù)器為了特定的目的需要使用某個(gè)模塊時(shí),是通過(guò)調(diào)用該模塊的Dispatch函數(shù)來(lái)實(shí)現(xiàn)的汹粤,調(diào)用時(shí)必須將任務(wù)的名稱(chēng)及相應(yīng)的參數(shù)傳遞給該函數(shù)命斧。在DSS中田晚,使用角色(Role)這個(gè)術(shù)語(yǔ)來(lái)描述特定的任務(wù)嘱兼。Dispatch函數(shù)的格式如下所示:

  void MyModuleDispatch(QTSS_Role inRole,QTSS_RoleParamPtr inParams)贤徒;

其中MyModuleDispatch是Dispatch函數(shù)的名稱(chēng)芹壕;MyModule是模塊的文件名汇四;inRole是角色的名稱(chēng),只有注冊(cè)了該角色的模塊才會(huì)被調(diào)用踢涌;inParams則是一個(gè)結(jié)構(gòu)體通孽,可用于傳遞相應(yīng)的參數(shù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末睁壁,一起剝皮案震驚了整個(gè)濱河市背苦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌潘明,老刑警劉巖行剂,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異钳降,居然都是意外死亡厚宰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)遂填,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)铲觉,“玉大人,你說(shuō)我怎么就攤上這事吓坚∧煊模” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵礁击,是天一觀(guān)的道長(zhǎng)并齐。 經(jīng)常有香客問(wèn)我,道長(zhǎng)客税,這世上最難降的妖魔是什么况褪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮更耻,結(jié)果婚禮上测垛,老公的妹妹穿的比我還像新娘。我一直安慰自己秧均,他們只是感情好食侮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著目胡,像睡著了一般锯七。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上誉己,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天眉尸,我揣著相機(jī)與錄音,去河邊找鬼。 笑死噪猾,一個(gè)胖子當(dāng)著我的面吹牛霉祸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播袱蜡,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼丝蹭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了坪蚁?” 一聲冷哼從身側(cè)響起奔穿,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敏晤,沒(méi)想到半個(gè)月后巫橄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茵典,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年湘换,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片统阿。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彩倚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扶平,到底是詐尸還是另有隱情帆离,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布结澄,位于F島的核電站哥谷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏们妥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一勉吻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧齿桃,春花似錦、人聲如沸短纵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鱼冀。三九已至报破,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雷绢,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工理卑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翘紊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓藐唠,卻偏偏與公主長(zhǎng)得像帆疟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宇立,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 一踪宠、簡(jiǎn)歷準(zhǔn)備 1、個(gè)人技能 (1)自定義控件妈嘹、UI設(shè)計(jì)柳琢、常用動(dòng)畫(huà)特效 自定義控件 ①為什么要自定義控件? Andr...
    lucas777閱讀 5,200評(píng)論 2 54
  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,180評(píng)論 0 3
  • 一 前言 RTP/RTCP協(xié)議是流媒體通信的基石润脸。RTP協(xié)議定義流媒體數(shù)據(jù)在互聯(lián)網(wǎng)上傳輸?shù)臄?shù)據(jù)包格式柬脸,而RTCP協(xié)...
    weizhenwei閱讀 33,310評(píng)論 4 48
  • 我在讀《黑木頭》這本書(shū)中的“生死之夜”這篇文章中,黑木頭用自己的生命拯救了外婆毙驯,令我感動(dòng)倒堕。為了外婆,黑木頭不惜一切...
    知識(shí)的海洋_1643閱讀 135評(píng)論 0 0
  • 一對(duì)恩愛(ài)的夫妻爆价,由于妻子的一場(chǎng)意外的車(chē)禍離開(kāi)人世垦巴。丈夫傷心欲絕,終日昏昏沉沉走不出失去妻子悲傷的陰影中铭段。最...
    wjs123閱讀 356評(píng)論 2 5