背景描述:
實現(xiàn)一款視頻播放器,同時支持直播和錄播功能
功能清單:
支持解析m3u8或flv兩種直播流,
支持錄播且多段分段視頻播放
支持直播流之間互相切換
支持直播與錄播之間互相切換
支持播放器工具欄定制化開發(fā)
技術(shù)選型
video.js + flv.js + videojs-flvjs
videojs
Video.js是專為HTML5世界打造的網(wǎng)絡(luò)視頻播放器。它支持HTML5和Flash視頻,以及YouTube和Vimeo(通過插件)。它支持在臺式機和移動設(shè)備上播放視頻。該項目始于2010年年中,現(xiàn)在已在播放器上使用50,000 100,000 200,000 40萬個網(wǎng)站。
定位: HTML5 & Flash video player
特點:
支持直播、錄播、以及集成第三方插件播放技術(shù),同事支持定制化控制欄開發(fā);
并且在該社區(qū)已經(jīng)建立了數(shù)百個您可以安裝的皮膚和插件,例如Chromecast,IMA甚至VR
初始化方式:
1.引用庫
<link rel="stylesheet">
<script src="http://vjs.zencdn.net/7.3.0/video.min.js"></script>
-
html部分
<video id="my-player" class="video-js"> <p class="vjs-no-js"> To view this video please enable JavaScript, and consider upgrading to a web browser that <a target="_blank"> supports HTML5 video </a> </p> </video> -
js部分
var player = videojs('my-player', { techOrder: ["html5"], autoplay: "muted", controls: true, controlBar: { volumePanel: false, remainingTimeDisplay: false, progressControl: false, fullscreenToggle: false, audioTrackButton: false, playToggle: false, liveDisplay: false, pictureInPictureToggle: false }, sources: [ { src: "http://localhost:8083/video/video/oceans.mp4", type: "video/mp4" //錄播 }, { src: "http://ivi.bupt.edu.cn/hls/hunanhd.m3u8", type: "application/x-mpegURL" //直播 } ] }, function onPlayerReady() { videojs.log('Your player is ready!'); // In this context, `this` is the player that was created by Video.js. this.play(); // How about an event listener? this.on('ended', function() { videojs.log('Awww...over so soon?!'); }); });
代碼解釋:當(dāng)錄播源oceans.mp4初始化不成功的情況下會采用湖南衛(wèi)視直播流進行播放(不支持多段分段處理),且定制化了默認(rèn)組件初始化方式
flvjs
用純JavaScript編寫的HTML5 Flash Video(FLV)播放器,不帶Flash,
flv.js的工作原理是將FLV文件流轉(zhuǎn)換為ISO BMFF(分段MP4)段,然后<video>通過Media Source Extensions API 將mp4段饋送到HTML5 元素中。
定位:HTML5 FLV Player
特點:
具有H.264 + AAC / MP3編解碼器播放功能的FLV容器
多段分段視頻播放
HTTP FLV低延遲實時流播放
通過WebSocket進行FLV實時流播放
與Chrome,F(xiàn)ireFox,Safari 10,IE11和Edge兼容
極低的開銷,瀏覽器可以加速硬件
初始化方式:
1.引用庫
<script src="flv.min.js"></script>
2.html部分
<video id="videoElement"></video>
3.js部分
//場景1:直播
if (flvjs.isSupported()) {
var videoElement = document.getElementById('videoElement');
var flvPlayer = flvjs.createPlayer({
type: 'flv',
url: "https://dlhdl-cdn.zhanqi.tv/zqlive/197952_NHycj.flv",
isLive: true
});
flvPlayer.attachMediaElement(videoElement);
flvPlayer.load();
flvPlayer.play();
}
//場景2:錄播(單段)
if (flvjs.isSupported()) {
var videoElement = document.getElementById('videoElement');
var flvPlayer = flvjs.createPlayer({
type: 'flv',
url: 'http://localhost:8083/video/video/bbb.flv'
});
flvPlayer.attachMediaElement(videoElement);
flvPlayer.load();
flvPlayer.play();
}
//場景3:錄播(多段分段)
if (flvjs.isSupported()) {
var videoElement = document.getElementById('videoElement');
var flvPlayer = flvjs.createPlayer({
type: 'flv',
duration: 73000,
segments: [
{
duration: 33000,
url: "http://localhost:8083/video/video/bbb.flv"
},
{
duration: 40000,
url: "http://localhost:8083/video/video/play.flv"
}
]
});
flvPlayer.attachMediaElement(videoElement);
flvPlayer.load();
flvPlayer.play();
}
期中總結(jié):
就目前前面所看到的,videojs滿足了直播及錄播部分的功能但對于多段處理沒有解決辦法,而flvjs滿足了直播,錄播,多段處理,但對于視頻格式局限于flv,且不能定制化開發(fā)控制欄
videojs與flvjs本質(zhì)上是兩個不相關(guān)的庫,無論是技術(shù)上還是初始化實現(xiàn)上,而我們的需求功能點恰巧分散在這兩個庫中,如何將其融合呢,接下來登場的是videojs-flv
videojs-flvjs
該庫允許Video.js技術(shù)使用flv.js通過MSE(而非Flash)播放FLV
定位:讓videojs可以使用flvjs的技術(shù)去播放FLV格式視頻文件
初始化方式:
1.引用庫
<!-- Video.js -->
<link href="http://path/to/video-js.css" rel="stylesheet">
<script src="http://path/to/video.min.js"></script>
<!-- flv.js -->
<script src="http://path/to/flv.min.js"></script>
<!-- videojs-flvjs -->
<script src="http://path/to/videojs-flvjs.min.js"></script>
2.html部分
<video id="videojs-flvjs-player"></video>
3.js部分
//場景1 錄播(單段)
videojs('videojs-flvjs-player', {
techOrder: ['html5', 'flvjs'],
flvjs: {
mediaDataSource: {
isLive: false,
cors: true,
withCredentials: false
}
},
sources: [{ src: "http://localhost:8083/video/video/bbb.flv", type: "video/flv"}]
});
//場景2 錄播(多段)
videojs('videojs-flvjs-player', {
techOrder: ['html5', 'flvjs'],
flvjs: {
mediaDataSource: {
isLive: false,
cors: true,
withCredentials: false,
duration: 73000,
segments: [
{
duration: 33000,
url: "http://localhost:8083/video/video/bbb.flv"
},
{
duration: 40000,
url: "http://localhost:8083/video/video/play.flv"
}
]
},
sources: [{ src: "-1", type: "video/flv"}]
}
});
期末總結(jié):
videojs是支持集成第三方插件播放技術(shù),它默認(rèn)是支持html5和flash兩種技術(shù)方式,而videojs-flv其實是給videojs注冊了一個針對flv格式的解析技術(shù)。
接下來我們看一下videojs-flv的源碼

首先他從全局環(huán)境獲取到了videojs的全局函數(shù)


所以官網(wǎng)才會說是通過flvjs技術(shù)去播放flv格式文件,不過官網(wǎng)只給出了通過videojs初始化單段的案例也就是場景一(單段)的案例,并沒有給出結(jié)合之后如何初始化多段分段播放的例子,這里著實踩了不少坑。遇到這種情況,首先通過源碼能夠鎖定大方向沒錯,只要flv能支持的功能,結(jié)合之后videojs肯定也是支持的,不需要猶豫,其次官方?jīng)]有給出詳細(xì)案例的情況,需要我們大膽的去嘗試和驗證。其實最后多段的實現(xiàn)案例中,source中對象的src為-1并沒有任何意義,但是一定得有內(nèi)容,不能為空字符串。關(guān)鍵一點,type必須指定video/flv格式,這是和用flvjs去初始化多段分段的案例中不同的地方。
至此,通過videojs-flvjs將videojs和flvjs兩個庫進行了一個融合,達到了功能清單中所有的功能在一個播放器實現(xiàn)的技術(shù)需求。
最終采用的直播方式為:HLS提供 的m3u8視頻直播流,及flv格式多段錄播文件流。期間定制化了播放器控制欄組件,下一章預(yù)備分享,定制化videojs控制欄組件開發(fā)。敬請期待。。。