來源:http://www.sharp-i.net/big5/articles/article/26.htm

隨著互聯網的飛速發展,流媒體技術的應用越來越廣泛,從網上廣播、電影播放到遠程教學以及在線的新聞網站等都用到了流媒體技術。但現有公開文獻所報道的大 多是利用現有的流媒體服務器來搭建一個流媒體服務系統,或者是針對流媒體數據的編碼方式所進行的研究。本文對流媒體服務器技術的研究重點在於如何建立一個 服務器,並且在實現流媒體傳輸的兩個基本協議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字段的那個時鐘。由於發送方 發出的所有流和發送方報告都使用同一個絕對時鐘,接收方就可以比較來自同一數據源的兩個流的絕對時間,從而確定如何將一個流中的時間戳值映射為另一個流中 的時間戳值。

RTP/RTCP流媒體服務器技術研究相关推荐

  1. 【流媒體】jrtplib—VS2010 下RTP开源协议库JRTPLIB3.9.1编译

    [流媒體]jrtplib-VS2010下RTP开源协议库JRTPLIB3.9.1编译 SkySeraph Apr 7th 2012 Email:skyseraph00@163.com 一.JRTPLI ...

  2. 【流媒體】live555—VS2010/VS2013 下live555编译、使用及测试

    [流媒體]live555-VS2010 /VS2013 下live555编译.使用及测试 SkySeraph Apr 11st 2012 Email:skyseraph00@163.com 更多精彩请 ...

  3. c#(服务器)与java(客户端)通过socket传递对象_C#(服務器)與Java(客戶端)通過Socket傳遞對象...

    最近做項目,需要C#與java間的交互,也就是C#編寫服務器,java編寫客戶端,讓兩者進行通信. 通信無非就是互發數據,首選Socket技術,通過TCP協議建立長連接,一般是以字節數組的形式傳遞數據 ...

  4. Web服務器的配置方法

      Web服務器的配置方法 一.               安裝IIS 1.      進入[控制面板]-à[新增/移除Windows元件],勾選Internet Information Serve ...

  5. 【流媒體】Android 实时视频采集—Camera预览采集

    [流媒體]Android 实时视频采集-Cameara预览采集 SkySeraph Mar 26th 2012  SZ Email:skyseraph00@163.com 更多精彩请直接访问SkySe ...

  6. linux控制cache使用值e,[轉]Linux塊設備加速緩存bcache和dm-cache:使用SSD來加速服務器...

    在 LSFMM 2013 峰會上,Mike Snitzer, Kent Overstreet, Alasdair Kergon, 和 Darrick Wong 共同主持了一個討論,內容是關於兩個彼此獨 ...

  7. c#服务器上的文件怎么打印,C# 如何調用客戶端打印機打印服務器上的word文件

    [size=13px]    做了一個系統,需要打印word,服務器上有打印模塊,打印之前是將打印的內容通過書簽的新式生成了一個新的word保存在服務器上,在客戶端訪問系統打印的時候出現了一些問題.客 ...

  8. java饥荒,饥荒DTS服務器modoverrides.lua生成工具

    这是饥荒DTS服務器modoverrides.lua生成工具,<饥荒>是由Klei制作发行的一款动作冒险类求生游戏,<饥荒>的故事讲述的饰淦髫于一名科学家被恶魔传送到了异世界荒 ...

  9. resin-pro-4.0.34 服務器在windows环境下的配置

    resin-pro-4.0.34 服務器在windows环境下的配置 (轉載请注明作者:icelong) 到caucho網站上http://www.caucho.com/download/ 下載 re ...

最新文章

  1. Hyper-V应用指南之6-差异磁盘的使用[转]
  2. PHP操作文件常用函数
  3. Scrapy学习-25-Scrapyd部署spider
  4. jQuery.noop()方法
  5. birt 报表设计(2)—介绍
  6. MapReduce-从HBase读取数据处理后再写入HBase
  7. C++_函数_函数的占位参数_函数重载---C++语言工作笔记034
  8. flow control
  9. 嵌入式系统中断实验c语言,中断的实验现象
  10. mysql药品管理_药品管理系统(药库管理)+数据库连接代码
  11. python代码混淆
  12. 【Proteus仿真】51单片机+红外测距仪(GP2D12)+ADC0809模数转换
  13. html限制视频上传大小,视频格式大小要求
  14. Pickit 3 - MPLAB Target device ID does not match 解决办法之一
  15. esxi01磁盘扩容_给EXSI虚拟机中linux硬盘扩容
  16. 中央民族大学计算机考研2020,2020年中央民族大学856计算机学科专业综合考研复习资料...
  17. 解决服务器发回了不可路由的地址。使用服务器地址代替的问题
  18. ubuntu实时监测显卡进程的方法
  19. 学习记录:二层网络环路相关
  20. IntelliJ IDEA项目正常编译,但是代码部分飘红

热门文章

  1. Redhat GRUB配置错误修复
  2. IOS仿微信键盘快捷工具栏
  3. Java连接Mysql数据库增删改查实现
  4. gazebo入门_Gazebo仿真控制中,有哪些你不知道的秘密?
  5. mysql 用户名中主机$_phpMyAdmin 尝试连接到 MySQL 服务器,但服务器拒绝连接。您应当检查配置文件中的主机、用户名和密码,...
  6. graphpad如何检测方差齐_如何选择方差分析中“多重比较”的方法?
  7. OPenGL实例化绘制、普通绘制说明
  8. 计算机设计文献参考,优秀计算机设计论文参考文献 计算机设计论文参考文献数量是多少...
  9. 删除用户的命令是什么mysql_mysql新添加用户与删除用户具体操作命令_MySQL
  10. webpack3 css,媒体查询不能使用CSS /样式加载器和Webpack3