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