陸 亮 連云港廣電傳媒集團(臺)
在移動互聯(lián)網(wǎng)快速發(fā)展的背景下,我國媒體融合發(fā)展已是大勢所趨。今年兩會,直播成為人民日報社新媒體中心的新亮點。人民日報社全媒體記者密切分工配合,在兩會現(xiàn)場搭建自有的直播系統(tǒng),實時提供高清直播信號,讓受眾直擊兩會現(xiàn)場。根據(jù)相關統(tǒng)計,人民日報新媒體中心共推出兩會直播48場,總觀看量超4360萬,總直播時長超50小時。直播無疑已成為媒體獲取觀看流量的主要抓手。
直播流媒體服務架構如圖1所示,主要由推流端、拉流端、媒體服務器所示,三者由推流協(xié)議、拉流播放協(xié)議依次連接。在推、拉流協(xié)議的應用場景中,RTMP可以用在雙端,HLS只能用在拉流端。
推流端即主播端,主要通過手機、攝像機、攝像頭采集視頻數(shù)據(jù),麥克風采集音頻數(shù)據(jù),經(jīng)過一系列前端信號采集和處理、編碼、封裝,然后推流到直播流媒體平臺,通過CDN網(wǎng)絡分發(fā),在拉流播放端的用戶可以通過多屏觀看及互動,直播流媒體服務組成如圖2所示。
圖1 直播流媒體服務架構
圖2 直播流媒體服務組成
直播流媒體業(yè)務有兩種協(xié)議可供選擇:HLS 和RMTP。HLS是蘋果公司基于 HTTP 的流媒體傳輸協(xié)議,可支持流媒體的直播和點播,主要應用在iOS 系統(tǒng),為 iOS 設備(如 iPhone、iPad)提供音視頻直播和點播方案。RTMP是 Adobe Systems 公司為Flash 播放器和服務器之間音頻、視頻和數(shù)據(jù)傳輸開發(fā)的開放協(xié)議,RTMP 是一種設計用來進行實時數(shù)據(jù)通信的網(wǎng)絡協(xié)議,主要用來在 Flash/AIR 平臺和支持RTMP協(xié)議的流媒體/交互服務器之間進行音視頻和數(shù)據(jù)通信。
2.1.1 HLS工作原理
當采集推流端將視頻流推送到流媒體服務器時,服務器將收到的流信息每緩存一段時間就封包成一個新的ts文件,同時在服務器建立一個m3u8的索引文件來維護最新幾個 ts 片段的索引。當播放端獲取直播時,從 m3u8 索引文件獲取最新的 ts 視頻文件片段播放,從而保證用戶在任何時候連接時都會看到較新的內容,實現(xiàn)近似直播的體驗。相對于常見的流媒體直播協(xié)議,HLS 最大的不同在于直播客戶端獲取到的并不是一個完整的數(shù)據(jù)流,而是連續(xù)的、短時長的媒體文件,客戶端不斷地下載并播放這些小文件。這種方式的理論最小延時為一個 ts 文件的時長,一般情況為 2-3 個 ts 文件的時長。HLS的分段策略,基本上推薦是 10 秒一個分片,因此,通常 HLS 直播延時會達到 20-30s,而高延時對于需要實時互動體驗的直播來說是不可接受的。HLS 基于短連接 HTTP,HTTP 是基于 TCP 的,這就意味著 HLS 需要不斷地與服務器建立連接,TCP 每次建立連接時的三次握手、慢啟動過程、斷開連接時的四次揮手都會產(chǎn)生消耗。HLS的優(yōu)點是,數(shù)據(jù)通過HTTP 協(xié)議傳輸,所以采用 HLS 時不用考慮防火墻或者代理的問題;使用短時長的分片文件來播放,客戶端可以平滑地切換碼率,以適應不同帶寬條件下的播放。
圖3 直播協(xié)議分類
圖4 nginx環(huán)境搭建
RTMP是Adobe Systems公司為Flash播放器和服務器之間音頻、視頻和數(shù)據(jù)傳輸開發(fā)的開放協(xié)議。它有以下三種變種:
(1)工作在TCP之上的明文協(xié)議,使用端口1935;
(2)RTMPT封裝在HTTP請求之中,可穿越防火墻;
(3)RTMPS類似RTMPT,但使用的是HTTPS連接;
RTMP協(xié)議被Flash用于對象、視頻、音頻的傳輸。這個協(xié)議建立在TCP協(xié)議或者輪詢HTTP協(xié)議之上。RTMP協(xié)議就像一個用來裝數(shù)據(jù)包的容器,這些數(shù)據(jù)既可以是AMF格式的數(shù)據(jù),也可以是FLV中的視音頻數(shù)據(jù)。一個單一的連接可以通過不同的通道傳輸多路網(wǎng)絡流,這些通道中的包都是按照固定大小的包傳輸?shù)摹D3是直播協(xié)議的分類。
近幾年,主流的開源直播軟件解決方案有Simple-RTMP-Server和nginx-rtmp-module。本文主要介紹nginx-rtmp-module,它依賴于nginx,以第三方模塊的形式提供直播功能,推流側使用RTMP協(xié)議,播放側使用HLS協(xié)議。
圖5 RTMP statistics頁面
圖6 OBS參數(shù)配置
Nginx是一款輕量級的Web服務器/反向代理服務器及電子郵件代理服務器,并在一個BSD-like協(xié)議下發(fā)行。其特點是占有內存少,并發(fā)能力強。為了方便闡述,本文使用Windows環(huán)境下的nginx(事實上,linux環(huán)境下更能體現(xiàn)nginx的優(yōu)越性能)。我們在nginx官網(wǎng)下載nginx-1.8.1.zip,解壓在根目錄下。打開cmd命令窗口,進入nginx所在目錄,輸入啟動命令 start nginx ,在網(wǎng)頁中輸入localhost即可得nginx歡迎頁,如圖4所示,至此,nginx服務器搭建成功。
通過官網(wǎng)github下載nginx-rtmp-module軟件包,解壓放置在nginx目錄下,修改conf目錄下的nginx.conf文件。這些配置參數(shù)很重要,是直播功能能否實現(xiàn)的關鍵。為此,我們給出了詳細的參數(shù)配置。worker_processes 1;
events {
worker_connections 8192;
}
rtmp {
server{
listen 1935; #服務端口--默認
chunk_size 4096; #數(shù)據(jù)傳輸塊
的大小--默認
application vod { #設置直播的application名稱是 live
play /opt/video/vod;
}
application live{
live on; #live on表示開啟直播模式
}
}
}
http {
include mime.types;
default_type application/octet-stream;
sendfile off;
圖8 VLC拉流直播視頻
圖9 PC端直播頁面
圖10 移動端直播頁面
server_names_hash_bucket_size 128;
server {
listen 80;
server_name localhost;
location /stat{
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl{
root nginx-rtmp-module/;
}
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
nginx.conf文件參數(shù)配置完成后,重啟nginx。訪問http://localhost/stat頁面,如果我們能得到圖5所示界面則配置成功。
直播推流的工具有很多,諸如編碼器、推流軟件等。本文使用OBS實現(xiàn)推流功能。打開OBS配置參數(shù),如圖6 所示。圖7為OBS推流界面。
通過VLC軟件拉流,如果可以看到直播視頻,直播服務器的搭建配置成功,如圖8所示。3.4 播放端優(yōu)化
以上操作是從功能上完成直播拉流。目前,終端設備屏幕尺寸越來越多,不同設備的交互特質也有著巨大的差別,為了能夠快速部署以及在各種設備上都有良好的用戶體驗,我們搭建基于ThinkPHP框架的網(wǎng)站,配置PC、移動兩個模塊。在ThinkPHP框架的入口文件index.php中添加is_mobile函數(shù),用來實現(xiàn)PC端,移動端的自動切換,下文代碼用以實現(xiàn)上述功能。
function is_mobile(){
$user_agent = $_SERVER['HTTP_USER_AGENT'];
$mobile_agents = Array("240x320","acer","phone","sy mbian","windows ce","zte");
//意在說明情況,移動系統(tǒng)不做枚舉
$is_mobile = false;
foreach ($mobile_agents as $device) {
//這里把值遍歷一遍,用于查找是否有上述字符串出現(xiàn)過
if (stristr($user_agent, $device)) {
//stristr 查找訪客端信息是否在上述數(shù)組中,不存在即為PC端
$is_mobile = true;
break;
}
}
return $is_mobile;
}
//判斷
if(is_mobile()){
// 移動端模塊
define('BIND_MODULE','Mobile');
}else{
// PC端模塊
define('BIND_MODULE','Home');
}}
當用戶訪問網(wǎng)站時,系統(tǒng)根據(jù)訪問終端類型自動切換至相應的模塊,模塊調出匹配設備屏幕尺寸的網(wǎng)頁。通過這樣的機制,可以為用戶提供良好的視聽感受。
直播流暢效果受人數(shù)、地域、網(wǎng)絡狀況等因素影響,本地介紹的直播平臺支持最大并發(fā)數(shù)也是有限的。為了應對直播在線人數(shù)突增等諸多不穩(wěn)定因素,我們推薦使用CDN。
CDN即Content Delivery Network (內容分發(fā)網(wǎng)絡),是一種新型網(wǎng)絡構建方式,它是為能在傳統(tǒng)的IP網(wǎng)發(fā)布寬帶豐富媒體而特別優(yōu)化的網(wǎng)絡覆蓋層。簡單地說,CDN是一個經(jīng)策略性部署的整體系統(tǒng),通過用戶就近性和服務器負載的判斷,CDN確保內容以一種極為高效的方式為用戶的請求提供服務。內容服務基于緩存服務器,它位于網(wǎng)絡的邊緣,距用戶僅有“一跳”(Single Hop)之遙。同時,代理緩存是內容提供商源服務器(通常位于CDN服務提供商的數(shù)據(jù)中心)的一個透明鏡像。這樣的架構使得CDN服務提供商能夠代表他們客戶,即內容供應商,向最終用戶提供盡可能好的體驗,為用戶提供盡可能少的網(wǎng)絡延遲服務。
網(wǎng)絡直播作為基于“互聯(lián)網(wǎng)+媒體”理念應運而生的新生事物,將互聯(lián)網(wǎng)技術運用到內容開發(fā)中來,重新樹立“內容為王”的傳播理念。網(wǎng)絡直播也使得媒體內容擁有更強的針對性、時效性、吸引力、影響力和感染力。