|
前不久抽空對(duì)目前比較火的視頻直播,做了下研究與探索,了解其整體實(shí)現(xiàn)流程,以及探討移動(dòng)端HTML5直播可行性方案。 發(fā)現(xiàn)目前 WEB 上主流的視頻直播方案有 HLS 和 RTMP,移動(dòng) WEB 端目前以 HLS 為主(HLS存在延遲性問題,也可以借助 video.js 采用RTMP),PC端則以 RTMP 為主實(shí)時(shí)性較好,接下來將圍繞這兩種視頻流協(xié)議來展開H5直播主題分享。 一、視頻流協(xié)議HLS與RTMP1. HTTP Live StreamingHTTP Live Streaming(簡(jiǎn)稱 HLS)是一個(gè)基于 HTTP 的視頻流協(xié)議,由 Apple 公司實(shí)現(xiàn),Mac OS 上的 QuickTime、Safari 以及 iOS 上的 Safari 都能很好的支持 HLS,高版本 Android 也增加了對(duì) HLS 的支持。一些常見的客戶端如:MPlayerX、VLC 也都支持 HLS 協(xié)議。 HLS 協(xié)議基于 HTTP,而一個(gè)提供 HLS 的服務(wù)器需要做兩件事:
瀏覽器使用的是 m3u8 文件。m3u8 跟音頻列表格式 m3u 很像,可以簡(jiǎn)單的認(rèn)為 m3u8 就是包含多個(gè) ts 文件的播放列表。播放器按順序逐個(gè)播放,全部放完再請(qǐng)求一下 m3u8 文件,獲得包含最新 ts 文件的播放列表繼續(xù)播,周而復(fù)始。整個(gè)直播過程就是依靠一個(gè)不斷更新的 m3u8 和一堆小的 ts 文件組成,m3u8 必須動(dòng)態(tài)更新,ts 可以走 CDN。一個(gè)典型的 m3u8 文件格式如下: #EXTM3U #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000 gear1/prog_index.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=311111 gear2/prog_index.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=484444 gear3/prog_index.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=737777 gear4/prog_index.m3u8 可以看到 HLS 協(xié)議本質(zhì)還是一個(gè)個(gè)的 HTTP 請(qǐng)求 / 響應(yīng),所以適應(yīng)性很好,不會(huì)受到防火墻影響。但它也有一個(gè)致命的弱點(diǎn):延遲現(xiàn)象非常明顯。如果每個(gè) ts 按照 5 秒來切分,一個(gè) m3u8 放 6 個(gè) ts 索引,那么至少就會(huì)帶來 30 秒的延遲。如果減少每個(gè) ts 的長(zhǎng)度,減少 m3u8 中的索引數(shù),延時(shí)確實(shí)會(huì)減少,但會(huì)帶來更頻繁的緩沖,對(duì)服務(wù)端的請(qǐng)求壓力也會(huì)成倍增加。所以只能根據(jù)實(shí)際情況找到一個(gè)折中的點(diǎn)。 對(duì)于支持 HLS 的瀏覽器來說,直接這樣寫就能播放了: <video src="http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8" height="300"width="400"preload="auto"autoplay="autoplay"loop="loop"webkit-playsinline="true"></video> 2. Real Time Messaging ProtocolReal Time Messaging Protocol(簡(jiǎn)稱 RTMP)是 Macromedia 開發(fā)的一套視頻直播協(xié)議,現(xiàn)在屬于 Adobe。這套方案需要搭建專門的 RTMP 流媒體服務(wù)如 Adobe Media Server,并且在瀏覽器中只能使用 Flash 實(shí)現(xiàn)播放器。它的實(shí)時(shí)性非常好,延遲很小,但無法支持移動(dòng)端 WEB 播放是它的硬傷。 雖然無法在iOS的H5頁(yè)面播放,但是對(duì)于iOS原生應(yīng)用是可以自己寫解碼去解析的, RTMP 延遲低、實(shí)時(shí)性較好。 瀏覽器端, <linkhref="http://vjs./5.8.8/video-js.css"rel="stylesheet">
<videoid="example_video_1"class="video-js vjs-default-skin"controlspreload="auto"width="640"height="264"loop="loop"webkit-playsinline>
<sourcesrc="rtmp://10.14.221.17:1935/rtmplive/home"type='rtmp/flv'>
</video>
<scriptsrc="http://vjs./5.8.8/video.js"></script>
<script>
videojs.options.flash.swf = 'video.swf';
videojs('example_video_1').ready(function(){
this.play();
});
</script>
3. 視頻流協(xié)議HLS與RTMP對(duì)比
二、直播形式 目前直播展示形式,通常以YY直播、映客直播這種頁(yè)面居多,可以看到其結(jié)構(gòu)可以分成三層:① 背景視頻層 ② 關(guān)注、評(píng)論模塊 ③ 點(diǎn)贊動(dòng)畫 而現(xiàn)行H5類似直播頁(yè)面,實(shí)現(xiàn)技術(shù)難點(diǎn)不大,其可以通過實(shí)現(xiàn)方式分為:① 底部視頻背景使用video視頻標(biāo)簽實(shí)現(xiàn)播放 ② 關(guān)注、評(píng)論模塊利用 WebScoket 來實(shí)時(shí)發(fā)送和接收新的消息通過DOM 和 CSS3 實(shí)現(xiàn) ③ 點(diǎn)贊利用 CSS3 動(dòng)畫 了解完直播形式之后,接下來整體了解直播流程。 三、直播整體流程直播整體流程大致可分為:
四、H5 錄制視頻對(duì)于H5視頻錄制,可以使用強(qiáng)大的 webRTC (Web Real-Time Communication)是一個(gè)支持網(wǎng)頁(yè)瀏覽器進(jìn)行實(shí)時(shí)語(yǔ)音對(duì)話或視頻對(duì)話的技術(shù),缺點(diǎn)是只在 PC 的 Chrome 上支持較好,移動(dòng)端支持不太理想。 1. 使用 webRTC 錄制視頻基本流程 ① 調(diào)用 ② 將獲取到視頻流數(shù)據(jù)轉(zhuǎn)換成 ③ 利用 2. iOS原生應(yīng)用調(diào)用攝像頭錄制視頻流程① 音視頻的采集,利用AVCaptureSession和AVCaptureDevice可以采集到原始的音視頻數(shù)據(jù)流。 ② 對(duì)視頻進(jìn)行H264編碼,對(duì)音頻進(jìn)行AAC編碼,在iOS中分別有已經(jīng)封裝好的編碼庫(kù)( x264編碼 、 faac編碼 、 ffmpeg編碼 )來實(shí)現(xiàn)對(duì)音視頻的編碼。 ③ 對(duì)編碼后的音、視頻數(shù)據(jù)進(jìn)行組裝封包。 ④ 建立RTMP連接并上推到服務(wù)端。 五、搭建Nginx+Rtmp直播流服務(wù)1. 安裝nginx、nginx-rtmp-module① 先clone nginx項(xiàng)目到本地: brew tap homebrew/nginx ② 執(zhí)行安裝 brew install nginx-full --with-rtmp-module 2. nginx.conf配置文件,配置RTMP、HLS查找到nginx.conf配置文件(路徑/usr/local/etc/nginx/nginx.conf),配置RTMP、HLS。 ① 在http節(jié)點(diǎn)之前添加 rtmp 的配置內(nèi)容: rtmp{
server{
#監(jiān)聽的端口
listen1935;
# RTMP 直播流配置
applicationrtmplive {
liveon;
#為 rtmp 引擎設(shè)置最大連接數(shù)。默認(rèn)為 off
max_connections1024;
}
# HLS 直播流配置
applicationhls{
liveon;
hlson;
hls_path/usr/local/var/www/hls;
hls_fragment1s;
}
}
}
② 在http中添加 hls 的配置 location /hls{
# Serve HLS fragments
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /usr/local/var/www;
#add_header Cache-Controll no-cache;
expires -1;
}
3. 重啟nginx服務(wù)重啟nginx服務(wù),瀏覽器中輸入 http://localhost:8080 ,是否出現(xiàn)歡迎界面確定nginx重啟成功。 nginx -sreload 六、直播流轉(zhuǎn)換格式、編碼推流當(dāng)服務(wù)器端接收到采集視頻錄制端傳輸過來的視頻流時(shí),需要對(duì)其進(jìn)行解析編碼,推送RTMP/HLS格式視頻流至視頻播放端。通常使用的常見編碼庫(kù)方案,如 x264編碼 、 faac編碼 、 ffmpeg編碼 等。 鑒于 FFmpeg 工具集合了多種音頻、視頻格式編碼,我們可以優(yōu)先選用FFmpeg進(jìn)行轉(zhuǎn)換格式、編碼推流。 1.安裝 FFmpeg 工具 brew installffmpeg 2.推流MP4文件 視頻文件地址:/Users/gao/Desktop/video/test.mp4 推流拉流地址:rtmp://localhost:1935/rtmplive/home,rtmp://localhost:1935/rtmplive/home //RTMP 協(xié)議流 ffmpeg -re -i/Users/gao/Desktop/video/test.mp4-vcodec libx264 -acodec aac -f flv rtmp://10.14.221.17:1935/rtmplive/home //HLS 協(xié)議流 ffmpeg -re -i/Users/gao/Desktop/video/test.mp4-vcodec libx264 -vprofile baseline -acodec aac -ar44100-strict -2-ac1-f flv -q10rtmp://10.14.221.17:1935/hls/test 3.FFmpeg推流命令 ① 視頻文件進(jìn)行直播 ffmpeg -re -i/Users/gao/Desktop/video/test.mp4-vcodec libx264 -vprofile baseline -acodec aac -ar44100-strict -2-ac1-f flv -q10rtmp://192.168.1.101:1935/hls/test ffmpeg -re -i/Users/gao/Desktop/video/test.mp4-vcodec libx264 -vprofile baseline -acodec aac -ar44100-strict -2-ac1-f flv -q10rtmp://10.14.221.17:1935/hls/test ② 推流攝像頭+桌面+麥克風(fēng)錄制進(jìn)行直播 ffmpeg -f avfoundation -framerate 30-i"1:0"\-f avfoundation -framerate30-video_size640x480 -i"0"\-c:v libx264 -preset ultrafast \-filter_complex'overlay=main_w-overlay_w-10:main_h-overlay_h-10'-acodec libmp3lame -ar44100-ac1-f flv rtmp://192.168.1.101:1935/hls/test 七、H5 直播視頻播放移動(dòng)端iOS和 Android 都天然支持HLS協(xié)議,做好視頻采集端、視頻流推流服務(wù)之后,便可以直接在H5頁(yè)面配置 video 標(biāo)簽播放直播視頻。 <videocontrols preload="auto"autoplay="autoplay"loop="loop"webkit-playsinline> <source src="http://10.14.221.8/hls/test.m3u8"type="application/vnd.apple.mpegurl"/> <pclass="warning">Your browser does not support HTML5video.</p> </video> ② 針對(duì)微信瀏覽器,video標(biāo)簽層級(jí)最高的問題,需要申請(qǐng)?zhí)砑影酌麊?,?qǐng)參照 http://bbs.mb.qq.com/thread-1242581-1-1.html?ptlang=2052。 八、總結(jié)本文從視頻采集上傳,服務(wù)器處理視頻推流,以及H5頁(yè)面播放直播視頻一整套流程,具體闡述了直播實(shí)現(xiàn)原理,實(shí)現(xiàn)過程中會(huì)遇到很多性能優(yōu)化問題。 ① H5 HLS 限制必須是H264+AAC編碼。 ② H5 HLS 播放卡頓問題,server 端可以做好分片策略,將 ts 文件放在 CDN 上,前端可盡量做到 DNS 緩存等。 ③ H5 直播為了達(dá)到更好的實(shí)時(shí)互動(dòng),也可以采用RTMP協(xié)議,通過 參考資料: |
|
|