知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X(jué)表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
您當(dāng)前位置>首頁(yè) » 新聞資訊 » 小程序相關(guān) >
如何落地H5小程序直播開(kāi)發(fā)
發(fā)表時(shí)間:2021-1-4
發(fā)布人:葵宇科技
瀏覽次數(shù):51
大前端這幾年算是一個(gè)熱詞,對(duì)于前段來(lái)說(shuō)如果不是大前端,技術(shù)相對(duì)來(lái)說(shuō)就已經(jīng)算是落后了。如果還停留在對(duì)ES6,Vue這些基本技能的學(xué)習(xí)只能說(shuō)處于一個(gè)及格線。
如果想做的卓越必須必備另一些大前端技能,比如說(shuō)NodeJS,express.js, koaJs服務(wù)類,或者three.js這類3d數(shù)據(jù)圖像,還有二維圖像處理,比如d3,raphael, echart, 最后hls, flv視頻行業(yè)。
如果只會(huì)ES6,Vue,React, Webpack這只能算是前端,大前端是至少要掌握上面的一項(xiàng)技能的。這篇文章就是介紹大前端領(lǐng)域中的視頻直播。
本文主要講述的是H5前端部分,視頻音頻采集部分后面會(huì)但開(kāi)篇章來(lái)講。首先帶領(lǐng)大家快速實(shí)現(xiàn)一個(gè)直播系統(tǒng),然后再講解其中的重要概念,話不多說(shuō),直接開(kāi)擼。
工具安裝
這里主要講述mac系統(tǒng)的操作方法,windows系統(tǒng)會(huì)盡快補(bǔ)齊。
server是推流工具,tools里面有下面需要安裝的工具。
Mac安裝ffmpeg
- 首先需要安裝YASM,如果沒(méi)有安裝yasm的話,會(huì)報(bào)FFmpeg yasm/nasm not found or too old. Use --disable-yasm for a crippledbuild這個(gè)問(wèn)題,如果沒(méi)有安裝sdl的話,安裝完FFmpeg之后,bin目錄下沒(méi)有ffplay這個(gè)文件。
下載yasm;
// 可以在h5live中找到y(tǒng)asm
cd /h5live/tools/yasm-1.3.0
// 配置
./configure
// 編譯 & 安裝
make
sudo make install
復(fù)制代碼
下載sdl;
// 切可以在h5live中找到sdl目錄
cd /h5live/tools/SDL2-2.0.8
// 配置
./configure
// 編譯 & 安裝
make -j 16
sudo make install
復(fù)制代碼
// 切可以在h5live中找到ffmpeg,prefix為要安裝到的位置
cd /h5live/tools/ffmpeg-4.3
// 配置
./configure --prefix=/usr/local/ffmpeg --enable-debug=3 --enable-shared --disable-static
// 編譯 & 安裝
make -j 4
sudo make install
復(fù)制代碼
設(shè)置ffmpeg軟連接, 相當(dāng)于環(huán)境變量,目的是為了在任何目錄都可以使用ffmpeg命令,/usr/local/ffmpeg-4.3/ffmpeg
是安裝的路徑
ln -s /usr/local/ffmpeg-4.3/ffmpeg /usr/local/bin/ffmpeg
復(fù)制代碼
2.啟動(dòng)server
很簡(jiǎn)單,進(jìn)入h5live中server所在的目錄,運(yùn)行server程序即可。
cd /h5live/server
open server
復(fù)制代碼
可以看到這里提供了三種協(xié)議的路徑,分別是rtmp協(xié)議的1935接口,http-flv協(xié)議的7001端口和hls的7002端口。
3.執(zhí)行推流
找一個(gè)mp4格式的視頻文件,假設(shè)這個(gè)文件叫1.mp4,可以在1.map所在的文件夾下執(zhí)行下面的命令。
ffmpeg -re -i 1.mp4 -c copy -f flv rtmp://127.0.0.1:1935/live/movie
復(fù)制代碼
出現(xiàn)下圖的效果就表示1.MP4這個(gè)視頻開(kāi)始進(jìn)行流推送了。
4.視頻驗(yàn)證
上面我們已經(jīng)說(shuō)了server工具提供三種協(xié)議的視頻流,分別是rtmp,http-flv以及hls。
可以使用VLC播放器驗(yàn)證rtmp協(xié)議的視頻流。
在里面粘貼入rtmp://127.0.0.1:1935/live/movie
然后就可以看到直播的效果了。
hls協(xié)議的流媒體可以使用蘋果瀏覽器直接打開(kāi)觀看。我們可以直接把http://127.0.0.1:7002/live/movie.m3u8
放到蘋果瀏覽器的地址欄中查看效果。
至此我們的推流就做完了,在H5的直播開(kāi)發(fā)中,這些工作都是服務(wù)器,我們之所以演示這些是為了在實(shí)際的開(kāi)發(fā)中我們可以懂得直播的過(guò)程,可以快速的給出直播的解決方案。最主要的在服務(wù)還沒(méi)有開(kāi)發(fā)完成之前我們可以通過(guò)這樣的方式快速搭建一個(gè)推流系統(tǒng),前端先開(kāi)發(fā)起來(lái)。
// RTMP,可以使用VLC播放器
rtmp://127.0.0.1:1935/live/movie
// FLV
http://127.0.0.1:7001/live/movie.flv
// HLS 可以使用蘋果瀏覽器訪問(wèn)
http://127.0.0.1:7002/live/movie.m3u8
復(fù)制代碼
H5端播放器
這里才是前端真正需要關(guān)心的部分,主要介紹我們?nèi)绾斡胘s去寫一個(gè)直播的播放器,選擇一些已有的最佳實(shí)踐是最穩(wěn)妥的,這樣可以快速的滿足業(yè)務(wù)需求,這里我們會(huì)介紹三款播放器,以及他們的使用。同樣這些代碼我也傳到了github上。
video.js是國(guó)外比較流行的視頻框架,他的特長(zhǎng)是做了非常好的自定義ui,符合線上成品的場(chǎng)景,除了自定義ui,還提供了很多插件,比如彈幕,快捷鍵,hls支持等等。他是一個(gè)比較完整的js框架,點(diǎn)播、直播都很合適,缺點(diǎn)是文件較大。
hls.js適合做hls協(xié)議的一款小巧的框架,同樣也是點(diǎn)播直播都可以。缺點(diǎn)是需要自己書(shū)寫UI樣式。video.js可以支持hls也是因?yàn)椴寮腔趆ls.js
flv.js是B站開(kāi)源的flv格式的播放器,如果是http-flv協(xié)議的直播用它是非常合適的。
至于rtmp在H5的直播中是不常用的,所以這里就不講了。
使用videojs開(kāi)發(fā)
在github找到videojshttps://github.com/videojs/video.js
, 可以在這個(gè)網(wǎng)址中找到下面的兩個(gè)文件,下載下來(lái)放在我們本地。
在Video.js的插件文檔中存在大量的插件,我們可以從中找到自己需要的。https://videojs.com/plugins/
videojs-contrib-hls是一個(gè)支持hls直播的video插件。我們找到cdn, 將js保存到本地。使用方式很簡(jiǎn)單,只需要把插件的js引入進(jìn)來(lái)就可以了。
將video.min.js和videojs-contrib-hls.js以及video-js.min.css引入到頁(yè)面中,source標(biāo)簽的地址寫上我們hls的m3u8后綴地址。就可以了。
注意這里需要在服務(wù)器環(huán)境查看。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="video-js.min.css">
</head>
<body>
<video id=example-video width=600 height=300 class="video-js vjs-default-skin" controls>
<source
src="http://127.0.0.1:7002/live/movie.m3u8"
type="application/x-mpegURL">
</video>
<script src="video.min.js"></script>
<script src="videojs-contrib-hls.js"></script>
<script>
var player = videojs('example-video');
player.play();
</script>
</body>
</html>
復(fù)制代碼
可以看到videojs幫我們處理好了ui問(wèn)題。是一款可以快速使用礦建。
使用hls.js開(kāi)發(fā)直播頁(yè)面
需要下載對(duì)應(yīng)hls代碼,可以去github中尋找,https://github.com/video-dev/hls.js
。
使用方式也很簡(jiǎn)單,因?yàn)閔ls.js并沒(méi)有為我們提供UI樣式,所以我們只需要引入js即可。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<video id="video" controls width="400" height="300"></video>
<script src="hls.js"></script>
<script>
var video = document.getElementById('video');
var videoSrc = http://www.wxapp-union.com/'http://127.0.0.1:7002/live/movie.m3u8';
if (Hls.isSupported()) {
var hls = new Hls();
hls.loadSource(videoSrc);
hls.attachMedia(video);
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
video.src = http://www.wxapp-union.com/videoSrc;
}
</script>
</body>
</html>
復(fù)制代碼
HTTP-FLV
flv.js是B站開(kāi)源的一款flv播放器,可以說(shuō)是國(guó)人的驕傲,同樣使用起來(lái)非常簡(jiǎn)單。也是引入flv.js。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script src="flv.js"></script>
<video id="videoElement" controls width="400" height="300"></video>
<script>
if (flvjs.isSupported()) {
var videoElement = document.getElementById('videoElement');
var flvPlayer = flvjs.createPlayer({
type: 'flv',
url: 'http://127.0.0.1:7001/live/movie.flv'
});
flvPlayer.attachMediaElement(videoElement);
flvPlayer.load();
flvPlayer.play();
}
</script>
</body>
</html>
復(fù)制代碼
微信小程序直播
這里講述的是小程序的直播,默認(rèn)我這里認(rèn)為大家是有小程序開(kāi)發(fā)經(jīng)驗(yàn)的,所以如何創(chuàng)建小程序,安裝開(kāi)發(fā)者工具,調(diào)試等內(nèi)容就不說(shuō)了。
微信小程序直播使用的是媒體組件的live-player,并且他僅支持flv或者rtmp格式,這一點(diǎn)在前后端確認(rèn)技術(shù)方案時(shí)尤為重要。還有就是他只針對(duì)對(duì)應(yīng)行業(yè)開(kāi)放??梢圆榭催@里連接https://developers.weixin.qq.com/miniprogram/dev/component/live-player.html
符合上述類目的小程序開(kāi)放,需要先通過(guò)類目審核,再在小程序管理后臺(tái),「開(kāi)發(fā)」-「接口設(shè)置」中自助開(kāi)通該組件權(quán)限。
打開(kāi)這個(gè)權(quán)限之后,我們就可以使用小程序的live-player組件進(jìn)行直播開(kāi)發(fā)了。他的使用也非常簡(jiǎn)單。
<live-player src="https://domain/pull_stream" mode="RTC" autoplay bindstatechange="statechange" binderror="error" style="width: 300px; height: 225px;" />
復(fù)制代碼
Page({
statechange(e) {
console.log('live-player code:', e.detail.code)
},
error(e) {
console.error('live-player error:', e.detail.errMsg)
}
})
復(fù)制代碼
這里需要注意的是,開(kāi)發(fā)者工具不能進(jìn)行直播調(diào)試,只能使用遠(yuǎn)程調(diào)試。連接我們的手機(jī)查看效果。live-player 默認(rèn)寬度300px、高度225px,可通過(guò)wxss設(shè)置寬高。
至此H5和小程序的直播開(kāi)發(fā)我們就說(shuō)完了,以上內(nèi)容已經(jīng)足夠大家完成工作中的直播開(kāi)發(fā)任務(wù)和可能出現(xiàn)的直播業(yè)務(wù)了。
接著我們會(huì)介紹一下直播的流程、協(xié)議以及基于nginx搭建一個(gè)直播服務(wù)。后面的內(nèi)容偏理論和服務(wù)。和前端關(guān)系不大可以跳過(guò)。
直播的流程
對(duì)于一個(gè)直播流程來(lái)說(shuō)首先是視頻音頻等媒體的采集,一般采集方有三種,PC端,安卓端以及IOS端,他們的工作也都是依賴攝像頭和麥克風(fēng)的。一般直播的人會(huì)選擇購(gòu)買專業(yè)的攝像頭和麥克風(fēng)。這里收集到的數(shù)據(jù)是流的格式,也就是二進(jìn)制的數(shù)據(jù),這里的數(shù)據(jù)會(huì)經(jīng)過(guò)socket或者h(yuǎn)ttp上傳至服務(wù)器。
信息源采集之后第一個(gè)步驟是進(jìn)行編碼,因?yàn)椴杉降脑剂魇遣荒苤苯颖豢蛻舳诉M(jìn)行播放的,必須采用一定的協(xié)議去做編碼,一般視頻編碼采用H.264,音頻編碼一般是AAC。這兩種是直播行業(yè)最常見(jiàn)的編碼格式。
編碼之后一般可能會(huì)伴隨著字幕的疊加,當(dāng)然這個(gè)是不必須的是一個(gè)可有可無(wú)的過(guò)程。這里要說(shuō)的其實(shí)是對(duì)視頻的一些處理,可能添加水印之類的二次加工。
視頻和音頻處理之后就要進(jìn)行推流,也就是把視頻和音頻推送到服務(wù)器中,也就是我們上面使用ffmpeg將1.mp4推送的過(guò)程。
工作中服務(wù)器會(huì)將推送過(guò)來(lái)的流媒體經(jīng)過(guò)部署再把資源推到CDN上,一般我們靜態(tài)的資源或者多媒體資源都會(huì)發(fā)布到CDN來(lái)保證用戶體驗(yàn)和拉取的速度。
對(duì)于客戶端來(lái)說(shuō)是直接訪問(wèn)CDN的地址的,同樣這里的客戶端可能是PC, 安卓或者IOS的播放器。
以上就是一個(gè)簡(jiǎn)單的直播處理過(guò)程。
視頻的格式
一般我們常見(jiàn)的視頻格式是mp4,他的兼容性非常好,谷歌,火狐,蘋果,IE等瀏覽器都是支持的。webm是一種流式的視頻格式,常見(jiàn)于youtube網(wǎng)站,但是這種格式只有谷歌和火狐瀏覽器支持。
hls嚴(yán)格來(lái)說(shuō)他不是視頻格式,他是一種視頻協(xié)議,他的視頻格式是ts,為了好分辨一般我們叫他hls,這種格式是蘋果自身研究出來(lái)的,所以蘋果瀏覽器可直接支持,上面我們演示的時(shí)候hls是直接放在蘋果瀏覽器的地址欄可以直接播放的。
flv是早期flash的一種視頻格式,B站早起就采用的這種格式,即使現(xiàn)在B站也是支持H5播放器和flash播放器的。
直播協(xié)議
直播目前最常用的三種協(xié)議是HLS協(xié)議,RTMP協(xié)議和HTTP-FLV協(xié)議。HLS對(duì)應(yīng)的是hls格式的視頻也就是.ts。RTMP和HTTP-FLV都是對(duì)應(yīng)的flv格式的視頻。
HLS協(xié)議是最簡(jiǎn)單的也是最常用的,他是蘋果推出的一個(gè)直播協(xié)議,他的工作原理比較簡(jiǎn)單,H5一般通過(guò)video標(biāo)簽,從客戶端獲取一個(gè)M3U8索引文件,這個(gè)M3U8會(huì)直接放在video的src路徑中。
因?yàn)镸3U8是一個(gè)索引文件,他會(huì)被解析成很多的.ts片段,每一個(gè)片段就是一個(gè)直播流的分段。
瀏覽器的video標(biāo)簽在某個(gè)時(shí)間會(huì)再次請(qǐng)求m3u8,獲取新的直播流片段,這樣就實(shí)現(xiàn)了直播的實(shí)時(shí)播放,而發(fā)送這個(gè)m3u8的請(qǐng)求是瀏覽器自主的行為。
<body>
<video id=example-video width=600 height=300 class="video-js vjs-default-skin" controls>
<source
src="http://127.0.0.1:7002/live/movie.m3u8"
type="application/x-mpegURL">
</video>
<script src="video.min.js"></script>
<script src="videojs-contrib-hls.js"></script>
<script>
var player = videojs('example-video');
player.play();
</script>
</body>
復(fù)制代碼
這是一個(gè)比較標(biāo)準(zhǔn)的直播協(xié)議,但是m3u8不一定包含了ts文件,也有可能嵌套了一層m3u8文件,也就是說(shuō)第一個(gè)拿到的m3u8文件里面還是m3u8文件。
如果當(dāng)前的m3u8里面包含了m3u8文件,那么當(dāng)前這個(gè)文件就叫master playlist。
如果當(dāng)前的m3u8文件里面包含的是ts, 那他就叫media playlists。
這種情況不常見(jiàn),但是確實(shí)是存在的,我們需要額外注意一下。如果我們?cè)趯?shí)踐直播的時(shí)候拿到的流文件不播放,可能是播放器不支持這種嵌套。
m3u8分為動(dòng)態(tài)列表,靜態(tài)列表,全量列表。在直播行業(yè)基本是見(jiàn)不到靜態(tài)列表的,他只是存在標(biāo)準(zhǔn)中。
動(dòng)態(tài)列表主要用于直播的過(guò)程中,全量列表多用于點(diǎn)播,也就是錄播。m3u8的響應(yīng)結(jié)果就是一個(gè)文本文件。
第一行標(biāo)明了m3u8的版本,這個(gè)比較重要,因?yàn)樗苯由婕暗轿覀兊牟シ牌髦С值膆ls的版本,如果版本不支持,后面的一些指令可能就無(wú)法解析。
第二行是版本的聲明,默認(rèn)是3,第三行是默認(rèn)視頻的時(shí)長(zhǎng),第四行是視頻流塊的個(gè)數(shù),每次請(qǐng)求都會(huì)加1,再往下就是視頻的ts文件,前面的9.901是這個(gè)ts文件的時(shí)長(zhǎng)。這里決定了瀏覽器的video更新m3u8文件的時(shí)機(jī)。
靜態(tài)列表和動(dòng)態(tài)列表返回文件差不多,只是在第五行多添加了一個(gè)playlist-type值為event。其他的就沒(méi)什么區(qū)別了。
全量列表比動(dòng)態(tài)列表多了兩個(gè)東西,第一個(gè)是playlist-type值為vod,還有底部的ext-x-endlist代表結(jié)束,瀏覽器識(shí)別到這個(gè)字段就不會(huì)再發(fā)送請(qǐng)求了。
對(duì)于第一個(gè)ts文件,他會(huì)有一個(gè)PAT的包,這個(gè)PAT的包告訴我們要去找一個(gè)PMT的包,PMT會(huì)告訴我們所有的TS里面哪些是視頻TS哪些是音頻TS。很多TS組成一個(gè)叫做PES的東西。
瀏覽器像去解析一個(gè)視頻,首先要知道視頻幀和音頻幀,在第一個(gè)ts文件中會(huì)告訴瀏覽器,通過(guò)先找PAT, 再找PMT,再找TS文件,然后TS文件再按照視頻和音頻分類把相連的ts組成一個(gè)幀。
RTMP協(xié)議
RTMP是Real Time Messaging Protocol(實(shí)時(shí)消息傳輸協(xié)議)的首字母縮寫。該協(xié)議基于TCP, 是一個(gè)協(xié)議族,包括RTMP基本協(xié)議及RTMPT/RTMPS/RTMPE等多種變種。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ù)通信。
傳統(tǒng)的軟件和服務(wù)器之間的交互還是以RTMP為主,比如說(shuō)上文講的視頻音頻的采集以PC端為主,如果客戶端通過(guò)軟件的方式采集基本就是基于RTMP,如果采集端用的是H5他的協(xié)議一般是webrtc。這是兩種不同的技術(shù)方案。采集時(shí)RTMP傳輸過(guò)程中視頻也是flv格式的。這里需要注意一下。
HTTP-FLV協(xié)議
RTMP要比HLS協(xié)議用起來(lái)復(fù)雜一些因?yàn)樗腔赥CP協(xié)議的。HLS使用非常簡(jiǎn)單但他的實(shí)時(shí)性會(huì)差一些,也就說(shuō)他有延時(shí),切片越多延時(shí)越大。HTTP-FLV結(jié)合了HLS的優(yōu)點(diǎn)也就是http請(qǐng)求然后又集合了RTMP低延時(shí)的特性。
HTTP-FLV和RTMP都是長(zhǎng)連接,傳輸?shù)母袷揭捕际莊lv,不同點(diǎn)在于他們和CDN的鏈接還有播放器的鏈接上,RTMP是TCP而HTTP-FLV是HTTP。
HTTP-FLV相對(duì)于RTMP優(yōu)勢(shì)有很多,比如可以在一定程度上避免防火墻的干擾,可以很好地兼容HTTP302跳轉(zhuǎn),做到靈活調(diào)度,可以使用HTTPS做加密通道,可以很好的支持移動(dòng)端(安卓和IOS)。
#### Video標(biāo)簽介紹
這里我們補(bǔ)充一點(diǎn)video標(biāo)簽的知識(shí),針對(duì)于大多數(shù)的前端開(kāi)發(fā)來(lái)說(shuō),并沒(méi)有真正意義上的了解video標(biāo)簽,他的屬性,他的事件。很多人都停留在知道他是視頻標(biāo)簽,可以播放,暫停,調(diào)節(jié)音量,有個(gè)src屬性中。
這是很危險(xiǎn)的,Video標(biāo)簽是H5推出的一款功能十分強(qiáng)大的多媒體標(biāo)簽,可以說(shuō)他是網(wǎng)頁(yè)中媒體的未來(lái)。
標(biāo)簽屬性部分:
<video
src="test.map"
width="400"
height="225"
controls
controlslist="nodownload nofullscreen"
poster="預(yù)覽圖"
autoplay
muted
loop
preload
></video>
復(fù)制代碼
controls:底部控制條 controlslist:底部控制條定制 poster:預(yù)覽圖 autoplay: 自動(dòng)播放 muted: 靜音(移動(dòng)端非靜音的視頻是不允許自動(dòng)播放的,想要自動(dòng)播放一定要靜音) loop: 循環(huán)播放 preload: 預(yù)加載,每個(gè)瀏覽器表現(xiàn)不一致,尤其是移動(dòng)端,如果需要最好加上。
JS控制部分:
volume: 音量(0 - 1) currentTime: 設(shè)置獲取當(dāng)前播放時(shí)間,單位是秒,超清和高清分別是不同的地址,檔切換地址時(shí)需要定位時(shí)間。 src: 獲取視頻地址
video.volume = 0.5;
video.currentTime = 60;
video.src;
復(fù)制代碼
可以通過(guò)source標(biāo)簽兼容視頻地址出錯(cuò), 這種情況js需要使用currentSrc獲取當(dāng)前地址。
<video>
<source src="./test.map" type="video/mp4"></source>
<source src="./test2.map" type="video/mp4"></source>
</video>
復(fù)制代碼
video事件:
loadstart: 視頻開(kāi)始加載。 durationchange: 時(shí)長(zhǎng)變化,表示可以獲取視頻時(shí)長(zhǎng)了。 loadedmetadata: 當(dāng)指定的音頻/視頻的元數(shù)據(jù)已加載時(shí),會(huì)發(fā)生 loadedmetadata 事件 loadeddata: 當(dāng)前幀的數(shù)據(jù)已加載,但沒(méi)有足夠的數(shù)據(jù)來(lái)播放指定音頻/視頻的下一幀時(shí),會(huì)發(fā)生 loadeddata 事件 progress: 當(dāng)瀏覽器正在下載指定的音頻/視頻時(shí),會(huì)發(fā)生 progress 事件 canplay: 當(dāng)瀏覽器能夠開(kāi)始播放指定的音頻/視頻時(shí),會(huì)發(fā)生 canplay 事件 canplaythrough: 當(dāng)瀏覽器預(yù)計(jì)能夠在不停下來(lái)進(jìn)行緩沖的情況下持續(xù)播放指定的音頻/視頻時(shí),會(huì)發(fā)生 canplaythrough 事件 play: 暫停狀態(tài)改變到播放狀態(tài)就會(huì)觸發(fā)play事件 seeking: 切換進(jìn)度條的時(shí)候會(huì)觸發(fā)的事件。 seeked: seeking之后下載完數(shù)據(jù)就會(huì)執(zhí)行。 waiting: 播放狀態(tài)時(shí),seeking之后會(huì)觸發(fā)waiting。也就是播放狀態(tài)如果沒(méi)有足夠數(shù)據(jù)支撐播放就會(huì)waiting。 playing: 播放中狀態(tài)。 timeupdate: 播放時(shí)間更新的事件。 ended: 播放結(jié)束 error: 報(bào)錯(cuò)事件。
手動(dòng)搭建一個(gè)直播服務(wù)器
前面我們利用已經(jīng)集成好的server工具創(chuàng)建了一個(gè)直播的服務(wù)器,這里我們使用nginx手動(dòng)搭建一個(gè)類似的服務(wù)器,再來(lái)理解一下他的工作過(guò)程。
首先需要安裝nginx和ffmpeg工具。ffmpeg工具上面已經(jīng)有了安裝過(guò)程,nginx的安裝可以參考我之前的文章前端應(yīng)該了解的nginx
工具安裝完成之后我們開(kāi)始配置nginx。在在nginx.conf文件中配置,我們需要配置服務(wù)RTMP模塊,在配置文件的最底部新開(kāi)一個(gè)代碼塊叫rtmp,里面寫上監(jiān)聽(tīng)1935端口,視頻切片大小設(shè)置4000,也可以自行設(shè)置,然后配置一個(gè)rtmp的直播應(yīng)用rtmplive,在配置一個(gè)hls的直播應(yīng)用。
rtmp {
server {
# 監(jiān)聽(tīng)端口
listen 1935;
# 切片大小
chunk_size 4000;
# RTMP 直播流配置
application rtmplive {
# 開(kāi)啟直播
live on;
# 最大連接數(shù)
max_connections 1024;
}
# hls直播流配置
application hls {
live on;
hls on;
# 分割文件存儲(chǔ)的位置
hls_path /usr/local/var/www/hls;
# hls分片大小
hls_fragment 5s;
}
}
}
復(fù)制代碼
配置好這個(gè)之后需要在http模塊中配置訪問(wèn)位置。我們可以在server塊中增加location。
server {
listen 8080;
...
locaton /hls {
# 聲明相應(yīng)類型, 也就是響應(yīng)頭
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
# 目錄指向我們r(jià)tmp塊中切片的目錄
root /usr/local/var/www;
# 禁止緩存
add_header Cache-Control no-cache;
}
}
復(fù)制代碼
至此我們nginx就配置完畢了,可以重啟nginx進(jìn)行測(cè)試。
nginx -s reload
復(fù)制代碼
同樣的,我們可以找到前面的那個(gè)1.mp4使用ffmpeg來(lái)推流。這里視頻采用libx264編碼,音頻采用aac編碼,做成flv推送到rtmp://localhost:1935/rtmplive/rtmp域名,這個(gè)1935就是我們?cè)O(shè)置rtmp的端口,rtmplive就是應(yīng)用名稱。
ffmpeg -re -i 1.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/rtmplive/rtmp
復(fù)制代碼
-i: 輸入 -vcodec: 視頻編碼 acodec: 音頻編碼 這個(gè)時(shí)候就開(kāi)始切割我們的視頻了,這個(gè)過(guò)程也就像是攝像頭實(shí)時(shí)獲取視頻的過(guò)程。
這是一個(gè)rtmp協(xié)議的直播流,我們可以使用vlc來(lái)播放,只要在file/open networks中輸入rtmp://localhost:1935/rtmplive/rtmp
就可以播放了。
下面我們?cè)賮?lái)演示一下HLS的源文件制作,這里的ffmpeg命令基本相同,只是我們的路徑需要變一下。上面nginx配置了rtmplive和hls兩個(gè)。hls推流需要使用rtmp://localhost:1935/hls/stream
, 這里的stream可以隨意起,不過(guò)這個(gè)名字關(guān)系都后面訪問(wèn)的地址。
ffmpeg -re -i 1.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/hls/stream
復(fù)制代碼
這里的hls是http協(xié)議,我們之前在nginx的http協(xié)議中也增加了一個(gè)hls訪問(wèn)路徑。http的地址我們可以使用蘋果瀏覽器訪問(wèn)。也可以使用我們上面自己開(kāi)發(fā)的播放器訪問(wèn)。
http://localhost:8080/hls/stream.m3u8
復(fù)制代碼
http-flv的編譯比較復(fù)雜,我們這里就不過(guò)多介紹了。至此H5和小程序的直播我們就介紹完了。
作者:隱冬
來(lái)源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
相關(guān)案例查看更多
相關(guān)閱讀
- 報(bào)廢車
- typescript
- painter
- 網(wǎng)站建設(shè)首頁(yè)
- 網(wǎng)站沒(méi)排名
- 楚雄網(wǎng)站建設(shè)公司
- 小程序開(kāi)發(fā)費(fèi)用
- 云南網(wǎng)站建設(shè)特性
- 云南小程序開(kāi)發(fā)公司
- 云南網(wǎng)站建設(shè)案例
- 網(wǎng)站制作
- 快排推廣
- 小程序
- 網(wǎng)絡(luò)公司排名
- 小程序被騙
- 百度人工排名
- 網(wǎng)站建設(shè)需要多少錢
- 搜索排名
- 云南網(wǎng)站建設(shè)
- 網(wǎng)站建設(shè)公司地址
- 云南建設(shè)廳官方網(wǎng)站
- 報(bào)廢車管理系統(tǒng)
- 網(wǎng)站搭建
- 云南衛(wèi)視小程序
- 日歷組件
- 云南科技公司
- 昆明網(wǎng)站設(shè)計(jì)
- 跳轉(zhuǎn)小程序
- 百度小程序公司
- 昆明做網(wǎng)站建設(shè)的公司排名