流媒體服務器

1 引言

  隨著互聯網的飛速發展,流媒體技術的應用越來越廣泛,從網上廣播、電影播放到遠程教學以及在線的新聞網站等都用到了流媒體技術。但現有公開文獻所報道 的大多是利用現有的流媒體服務器來搭建一個流媒體服務系統,或者是針對流媒體數據的編碼方式所進行的研究。本文對流媒體服務器技術的研究重點在于如何建立 一個服務器,并且在實現流媒體傳輸的兩個基本協議RTP/RTCP的基礎上構建一個基本的流媒體服務器。

2 流媒體技術簡介

  2.1 “流”的定義

  現在網上傳輸視頻、音頻主要有下載(Download)和流式傳輸(Streaming)兩種方式。流式傳輸是連續傳送視/音頻信號,當流媒 體在客戶機播放時其余部分在后臺繼續下載。流式傳輸有順序流式傳輸(Progressive Streaming)和實時流式傳輸(Realtime Streaming)兩種方式。實時流式傳輸是實時傳送,特別適合現場事件,實時流式傳輸必須匹配連接帶寬,這意味著圖像質量會因網絡速度降低而變差,以 減少對傳輸帶寬的需求。“實時”的概念是指在一個應用中數據的交付必須與數據的產生保持精確的時間關系。

  在Internet中使用流式傳輸技術的連續時基媒體就稱為流媒體,通常也將其視頻與音頻稱為視頻流和音頻流。實現流式傳輸一般都需要專用服務器和播放器。

  2.2 流媒體系統組件

  流媒體是由各種不同軟件構成的,這些軟件在各個不同層面上互相通信,基本的流媒體系統包含以下3個組件:

  播放器(Player),用來播放流媒體的軟件。

  服務器(Server),用來向用戶發送流媒體的軟件。

  編碼器(Encode),用來將原始的音頻視頻轉化為流媒體格式的軟件。

  這些組件之間通過特定的協議互相通信,按照特定的格式互相交換文件數據。有些文件中包含了由特定編解碼器解碼的數據,這種編解碼器通過特定算法壓縮文件的數據量。

3 流媒體服務器的基本功能和服務方式

  3.1 流媒體服務器的主要功能

  (1)響應客戶的請求,把媒體數據傳送給客戶。流媒體服務器在流媒體傳送期間必須與客戶的播放器保持雙向通信(這種通信是必需的,因為客戶可能隨時暫停或快放一個文件)。

  (2)響應廣播的同時能夠及時處理新接收的實時廣播數據,并將其編碼。

  (3)可提供其他額外功能,如:數字權限管理(DRM),插播廣告,分割或鏡像其他服務器的流,還有組播。

  3.2 流媒體服務器的服務方式

  (1)單播。在客戶端與媒體服務器之間建立一個單獨的數據通道,從1臺服務器送出的每個數據包只能傳送給1個客戶機。

  (2)組播。在以組播技術構建的網絡上,允許路由器一次將數據包復制到多個通道上。

  (3)點播與廣播。點播連接是客戶端與服務器之間的主動的連接,在點播連接中,用戶通過選擇內容項目來初始化客戶端連接,用戶可以開始、停 止、后退、快進或暫停流。廣播指的是用戶被動地接收流,在廣播過程中,數據包的單獨一個拷貝將發送給網絡上的所有用戶,客戶端接收流,但不能控制流。

4 構建流媒體服務器

  4.1 RTP/RTCP協議簡介

  實時傳輸協議RTP(Realtime Transport Protocol):是針對Internet上多媒體數據流的一個傳輸協議, 由IETF(Internet工程任務組)作為RFC1889發布。RTP被定義為在一對一或一對多的傳輸情況下工作,其目的是提供時間信息和實現流同 步。RTP的典型應用建立在UDP上,但也可以在TCP或ATM等其他協議之上工作。RTP本身只保證實時數據的傳輸,并不能為按順序傳送數據包提供可靠 的傳送機制,也不提供流量控制或擁塞控制,它依靠RTCP提供這些服務。

  實時傳輸控制協議RTCP(Realtime Transport Control Protocol):負責管理傳輸質量在當前應用進程之間交換控制信息。在RTP會話期間,各參與者周期性地傳送RTCP包,包中含有已發送的數據包的數 量、丟失的數據包的數量等統計資料,因此,服務器可以利用這些信息動態地改變傳輸速率,甚至改變有效載荷類型。RTP和RTCP配合使用,能以有效的反饋 和最小的開銷使傳輸效率最佳化,故特別適合傳送網上的實時數據。

  RTCP主要有4個功能:

  (1)用反饋信息的方法來提供分配數據的傳送質量,這種反饋可以用來進行流量的擁塞控制,也可以用來監視網絡和用來診斷網絡中的問題;

  (2)為RTP源提供一個永久性的CNAME(規范性名字)的傳送層標志,因為在發現沖突或者程序更新重啟時SSRC(同步源標識)會變,需要一個運作痕跡,在一組相關的會話中接收方也要用CNAME來從一個指定的與會者得到相聯系的數據流(如音頻和視頻);

  (3)根據與會者的數量來調整RTCP包的發送率;

  (4)傳送會話控制信息,如可在用戶接口顯示與會者的標識,這是可選功能。

  4.2 RTP/RTCP工作過程

  工作時,RTP協議從上層接收流媒體信息碼流(如H.263),裝配成RTP數據包發送給下層,下層協議提供RTP和RTCP的分流。如在 UDP中, RTP使用一個偶數號端口,則相應的RTCP使用其后的奇數號端口。RTP數據包沒有長度限制,它的最大包長只受下層協議的限制。

  4.3 服務器的算法

  服務器軟件模型主要有兩種,即并發服務器和循環服務器。循環服務器(Iterative Server)是指在一個時刻只處理一個請求的服務器。并發服務器(Concurrent Server)是指在一個時刻可以處理多個請求的服務器。事實上,多數服務器沒有用于同時處理多個請求的冗余設備,而是提供一種表面上的并發性,方法是依 靠執行多個線程,每個線程處理一個請求,從客戶的角度看,服務器就像在并發地與多個客戶通信。

  由于流媒體服務時間的不定性和數據交互實時性的請求,流媒體服務器一般采用并發服務器算法。本文構建了一個基本的流媒體服務器,能夠同時響應 多個用戶的請求,把本地硬盤流媒體文件或實時數據流(H.263格式)發送給用戶。在應用中,把客戶分為請求實時數據的實時客戶和請求文件數據的文件客戶 兩類。主要算法為:

  (1)打開設備,分配資源。當設備準備好時,創建一個RTP實時服務線程和一個RTCP實時服務線程。

  (2)創建一個UDP套接字并將其綁定到所提供服務的地址之上。

  (3)反復調用接收模塊,接收來自客戶的RTCP報告,根據其類型做出響應。對新實時客戶的請求,把客戶地址添加到實時服務的客戶列表中,對 新文件客戶的請求,則創建一個新RTP文件服務線程和一個新RTCP文件服務線程;對已經在服務中的客戶則根據RTCP報告的內容調整服務。

  RTP實時服務線程1:初始化客戶列表和RTP首部。

  RTP實時服務線程2:從設備讀取媒體數據,把數據發送給實時服務列表中的客戶。

  RTP實時服務線程3:更新RTP首部和統計數據。

  RTP實時服務線程4:計算延時,重復第二步。

  RTCP實時服務線程1:初始化RTCP首部。

  RTCP實時服務線程2:發送發送方報告給實時服務列表中的客戶。

  RTCP實時服務線程3:計算延時,重復第二步。

  RTP文件服務線程1:初始化RTP首部。

  RTP文件服務線程2.:從文件讀取媒體數據,把數據發送給客戶。

  RTP文件服務線程3:更新已發送數據的統計信息,為生成發送方報告做準備。

  RTP文件服務線程4:計算延時,調整發送速度,正常情況下開始重復第二步。

  RTCP文件服務線程1:初始化RTCP首部,發送一個源描述(SDES)報文給客戶。

  RTCP文件服務線程2:根據已發送數據的統計信息生成發送方報告,發送給客戶。

  RTCP文件服務線程3:計算延時,正常情況下開始重復第一步。

5 流媒體服務器實現中應注意的問題

  5.1 會話和流的兩級分用

  一個RTP會話(Session)包括傳給某個指定目的地對(Destination Pair)的所有通信量,發送方可能包括多個。而從同一個同步源發出的RTP分組序列稱為流(Stream),一個RTP會話可能包含多個RTP流。一個 RTP分組在服務器端發送出去的時候總是要指定屬于哪個會話和流,在接收時也需要進行兩級分用,即會話分用和流分用。只有當RTP使用同步源標識 (SSRC)和分組類型(PTYPE)把同一個流中的分組組合起來,才能夠使用序列號(Sequence Number)和時間戳(Timestamp)對分組進行排序和正確回放。

  5.2 多線程的管理

  并發服務器模式要求用多線程來提供服務,所以多線程的管理十分重要。在本文構建的服務器中,不同客戶的請求和反饋都由服務器的主線程處理,由 于實時數據的獨有性,不同實時客戶可以共用一個RTP實時服務線程和一個RTCP實時服務線程,這樣可以大大減小服務器的負擔,而每個文件客戶由于請求的 文件不同,相應地對速度和開始時間的要求都可能不同,所以需要有自己獨有的RTP文件服務線程和RTCP文件服務線程。

  RTP服務線程負責把實時數據流發送給客戶, RTCP服務線程根據RTP線程的統計數據,產生發送方報告給客戶。RTP線程和RTCP線程之間通過一段共享內存交互統計數據,對共享內存必須設置互斥 體進行保護,防止出現錯誤讀寫。在這種方式下,服務器可以根據每個用戶的不同請求和具體情況方便地提供不同的服務。

  5.3 時間戳的處理

  時間戳字段是RTP首部中說明數據包時間的同步信息,是數據能以正確的時間順序恢復的關鍵。時間戳的值給出了分組中數據的第一個字節的采樣時 間 (Sampling Instant),要求發送方時間戳的時鐘是連續、單調增長的,即使在沒有數據輸入或發送數據時也是如此。在靜默時,發送方不必發送數據,保持時間戳的增 長,在接收端,由于接收到的數據分組的序號沒有丟失,就知道沒有發生數據丟失,而且只要比較前后分組的時間戳的差異,就可以確定輸出的時間間隔。

  RTP規定一次會話的初始時間戳必須隨機選擇,但協議沒有規定時間戳的單位,也沒有規定該值的精確解釋,而是由負載類型來確定時鐘的顆粒,這樣各種應用類型可以根據需要選擇合適的輸出計時精度。

  在RTP傳輸音頻數據時,一般選定邏輯時間戳速率與采樣速率相同,但是在傳輸視頻數據時,必須使時間戳速率大于每幀的一個滴答。如果數據是在同一時刻采樣的,協議標準還允許多個分組具有相同的時間戳值。

  5.4 媒體數據發送速度的控制

  由于RTP協議沒有規定RTP分組的長度和發送數據的速度,因而需要根據具體情況調整服務器端發送媒體數據的速度。對來自設備的實時數據可以 采取等時間間隔訪問設備緩沖區,在有新數據輸入時發送數據的方式,時間戳的設置相對容易。對已經錄制好的本地硬盤上的媒體文件,以H.263格式的文件為 例,由于文件本身不包含幀率信息,所以需要知道錄制時的幀率或者設置一個初始值,在發送數據的時候找出發送數據中的幀數目,根據幀率和預置值來計算時延, 以適當的速度發送數據并設置時間戳信息。

  5.5 多種流同步

  RTCP的一個關鍵作用就是能讓接收方同步多個RTP流,例如:當音頻與視頻一起傳輸的時候,由于編碼的不同,RTP使用兩個流分別進行傳 輸,這樣兩個流的時間戳以不同的速率運行,接收方必須同步兩個流,以保證聲音與影像的一致。為能進行流同步,RTCP要求發送方給每個傳送一個唯一的標識 數據源的規范名(Canonical Name),盡管由一個數據源發出的不同的流具有不同的同步源標識(SSRC),但具有相同的規范名,這樣接收方就知道哪些流是有關聯的。而發送方報告報 文所包含的信息可被接收方用于協調兩個流中的時間戳值。發送方報告中含有一個以網絡時間協議NTP(Network Time Protocol)格式表示的絕對時間值,接著RTCP報告中給出一個RTP時間戳值,產生該值的時鐘就是產生RTP分組中的TimeStamp字段的那 個時鐘。由于發送方發出的所有流和發送方報告都使用同一個絕對時鐘,接收方就可以比較來自同一數據源的兩個流的絕對時間,從而確定如何將一個流中的時間戳 值映射為另一個流中的時間戳值。

6 結論

  流媒體技術的應用日益廣泛,對流媒體技術的研究具有很大的實際意義,本文通過對RTP/RTCP協議的研究,分析流媒體服務器的一般功能和結 構,給出構建一個基本的流媒體服務器的實現方案,實驗證明可以同時滿足多個實時和文件客戶的要求,并已經應用于一個遠程監控系統中。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253086.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253086.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253086.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

試產機器發現元器件損毀 風險排查過程

產品在試產階段或者公測階段,發現有個別機器功能異常,研發定位為個別元器件損壞; 定位過程大致有如下步驟: A-故障現象復現 B-輸入輸出檢查 C-電源及管腳狀態測量 D-交叉驗證 E-基本外觀觀察和特性測量 然后將器件郵寄給原…

騰訊面試經驗2

時間:2017年10月16日11:30面試。 地點:重慶萬達艾美酒店。 信息:女,本科應屆生,面試后臺開發崗位。 在深圳的面試已經全部結束了,偶然間聽朋友說重慶、長沙等場地的面試還在進行中,只要修改面試…

簡易有效Api接口防攻擊策略

API(Application Programming Interface,應用程序編程接口)是一些預先定義的函數,目的是提供應用程序與開發人員基于某軟件或硬件得以訪問一組例程的能力,而又無需訪問源碼,或理解內部工作機制的細節。 簡單…

CSS 如何設置垂直居中

1、水平居中我們都知道,可以直接用: margin:0 auto; 2、垂直居中,需要做一點小小的計算,關鍵代碼如下: height: 600px; position: absolute; top: 50%; margin-top:-300px; 如需水平且垂直居中: height: 60…

被稱為海淀媽媽四大神器之一的傾聽者K3 硬件拆解

暑假期間發現很多博主都在推薦傾聽者K3,被海淀媽媽們稱為四大神器之一, 雖然暫沒聽說其他三大神器是什么,作為教育硬件愛好者還是決定先整個回來拆拆看。 在京東上搜到傾聽者K3版本一共有三種顏色,分別是藍色(悟空藍&…

有名信號量sem_open和內存信號量sem_init創建信號量的區別

有名信號量sem_open和內存信號量sem_init創建信號量的區別 分類: C/C sem_t *sem sem_open(const char *name, int oflag, .../*mode_t mode,unsinged int value) ;int sem_init(sem_t *sem,int shared, unsigned int value);區別:1.創建有名信號量必須…

KVM虛擬機相關步驟

KVM是Kernel-based Virtual Machine的簡稱,是一個開源的虛擬化模塊,該文檔是基于CentOS 7.4環境操作的 一、操作系統安裝 本文采用的是CentOS 7.4 1、查看系統版本 cat /etc/redhat-release 2、系統更新 Yum makecache &&yum update && …

dds設計信號發生器

高一 150206101 Dds數字信號發生器設計方案 DDS的工作原理框圖如下 在微機內,若插入一塊D/A轉換卡,然后編制一段小程序,如連續進行加一運算到一定值,然后連續進行減一 運算回到原值,在反復運行該程序,則微機…

Maven--資源文件resource的問題

2019獨角獸企業重金招聘Python工程師標準>>> Maven項目的目錄有: src/java/main src/java/resource src/test/main src/test/resource 有的時候在resource目錄下添加文件卻不能加載出來,解決的辦法是從把添加的資源文件添加到properties---&g…

pthread_create()創建線程最大個數

線程應用程序最常見導致創建線程失敗的原因是線程棧大小的設置。創建一個新的線程,默認情況下系統為線程棧預留了2MB的尋址空間。線程棧起始于進程虛擬 內存的高端地址,并向虛擬內存底端地址方向擴展。取決于線程本身的大小以及其它線程內存分配的情況&a…

C++ Primer 5 CH4 表達式

4.1 基礎 函數調用也是一種特殊的運算符,它對運算對象的數量沒有限制。C 的表達式要么是左值,要么是右值。左值可以位于賦值語句的左邊,右值則不可以。當一個對象被用作右值的時候,用的是對象的值;當對象被用作左值的時…

PHY以太網自動協商原理

自協商原理:自協商是通過一種叫做快速連接脈沖(Fast Link Pulse)的信號實現的,簡稱FLP。自協商的雙方通過FLP來交換數據。 在具備自協商能力的端口沒有Link的情況下,端口一直發送FLP,在FLP中包含著…

canvas--初級

摘要: canvas:默認寬高為300*150,需用canvas的API定義其寬高繪畫路徑以beginPath()開始,以closePath()結束常用方法fill()、stroke()、rect()、arc()、text()、lineTo()、moveTo()以下為代碼: var cdocument.getElementById("mycanvas&q…

撲克牌翻牌問題(遞歸)

撲克牌翻牌問題 題目描述: 有52張牌,使它們全部正面朝上,從第2張開始,凡是2的倍數位置上的牌翻成正面朝下;接著從第3張牌開始,凡是3的倍數位置上的牌,正面朝上的翻成正面朝下,正面朝下的翻成正面…

以太網自動協商原理

自協商基本原理 自動協商模式是端口根據另一端設備的連接速度和雙工模式,自動把它的速度調節到最高的公共水平,即線路兩端能具有的最快速度和雙工模式。 自協商功能允許一個網絡設備能夠將自己所支持的工作模式信息傳達給網絡上的對端,并接受…

Python學習-文件的調用-讀取

1.文件的打開 open(filename[,mode[,buffering]]) #這個一定要記得關文件。close.() filename,要以路徑的形式展示,比如在"c:\"中,則要這樣寫: rc:\filename 如果不用路徑展示,那就用filename.其會在執行文件所在的文件夾進行搜索…

javascript . 05 json的組成、for...in 遍歷對象、簡單數據類型與復雜數據類型的傳值與傳址、內置對象...

對象字面量 JSON var obj { aaa :999};   var json{"aaa":999,“bbb”:888}; ”kay“:value 對象字面2??定義方法和json很像,只有一點不同,json的key 必須加“”   ; 對象,數…

nohup命令

nohup命令 起因 ssh到機器上,然后執行某個程序,再登錄發現程序早就不運行了。 原因 ssh過去之后,執行的大部分命令(守護進程不會斷開),都是ssh進程的子進程,ssh斷開,命令自然會中斷 …

mac與phy如何實現網絡自適應

這兩天修改網卡驅動以實現10/100/1000M自適應,因此研究了下phy芯片和emac驅動如何兼容10/100/1000M網絡環境,記錄在此。 網絡中設備端數據鏈路層由mac芯片和phy芯片組成,phy芯片根據外部網絡環境完成自動協商以及配置,驅動中根據p…

asp.net(mvc) 框架

1、NFine mvcef 2、Grove orm架構 3、NHibernate orm 4、NBear 5、petshop 6、Membership 7、Brnshop 網上商城 8、cms快速開發:http://www.open-open.com/news/view/a90f1 9、c#開源框架:http://www.cnblogs.com/gaoyuchuanIT/articles/5612268.html 來…