Video.js-contrib-hls是一款基于Video.js框架的插件,主要用于支持MPEG-DASH和HLS播放,它是Video.js的一个补充和扩展,使得Video.js可以更加完善地支持流媒体播放。
一、安装和使用videojs-contrib-hls
安装videojs-contrib-hls可以直接使用npm进行安装:
npm install videojs-contrib-hls
然后通过import的方式引入插件:
import videojs from "video.js";
import "videojs-contrib-hls";
接下来在Video.js的初始化中通过hls参数来使用插件:
const player = videojs('video-player', {
techOrder: ['html5', 'flash'],
sources: [{
type: 'application/x-mpegURL',
src: 'http://example.com/your/hls/stream.m3u8'
}],
hls: {
// hls配置选项
}
});
在options中,我们可以对hls进行多种参数选项配置,例如最大解码缓存时间、每个请求片段缓存的大小等等。
二、支持自动切换清晰度
如果HLS流的源URL提供了多种不同的清晰度片段,videojs-contrib-hls可以自动根据网络条件以及播放设备的支持进行不同清晰度之间的自动切换。只需要在sources列表中添加多个清晰度的片源,插件会自动判断当前连接速度和设备支持的最高清晰度并进行自动切换。
const player = videojs('video-player', {
sources: [{
type: 'application/x-mpegURL',
src: 'http://example.com/your/hls/stream-240p.m3u8'
},{
type: 'application/x-mpegURL',
src: 'http://example.com/your/hls/stream-480p.m3u8'
},{
type: 'application/x-mpegURL',
src: 'http://example.com/your/hls/stream-720p.m3u8'
}],
hls: {
// hls配置选项
}
});
三、级联字幕
Video.js-contrib-hls还支持HLS流文件中的字幕级联,这意味着我们可以将多种语言的字幕同步在同一个流上进行播放,自由切换字幕,提升用户观看体验。
使用字幕级联需要在M3U8文件的EXT-X-MEDIA
标签中添加相同group-id的多个流,其中type分别为“AUDIO”和“SUBTITLES”表示分别为音频流和字幕流,URI为相对路径,LABLE为字幕语言名称,如下所示:
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="中文",DEFAULT=YES,AUTOSELECT=YES,URI="./audio.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="英文",URI="./audio_en.m3u8"
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="sub",NAME="中文",DEFAULT=YES,AUTOSELECT=YES,URI="./sub.m3u8"
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="sub",NAME="英文",URI="./sub_en.m3u8"
在Video.js初始化时使用插件的tracks参数,将多个字幕流添加到tracks中,如下所示:
const player = videojs('video-player', {
sources: [{
type: 'application/x-mpegURL',
src: './playlist.m3u8'
}],
tracks: [{
kind: 'subtitles',
src: './sub.m3u8',
srclang: 'zh',
label: '中文'
},{
kind: 'subtitles',
src: './sub_en.m3u8',
srclang: 'en',
label: 'English'
}],
hls: {
// hls配置选项
}
});
四、钩子函数的使用
videojs-contrib-hls还支持多种钩子函数,包括请求、缓存等等,可以方便地定制自己的播放器。 例如,在请求hls片段时可以使用xhrBeforeRequest钩子,对请求进行自定义操作,例如添加Authorization头部等。
player.hls.xhrBeforeRequest = function(options) {
options.headers = options.headers || {};
options.headers.Authorization = "Bearer " + token;
return options;
};
同样,我们还可以使用encryptWithDES钩子对hls流进行加密,从而保证播放源的安全性:
player.hls.encryptWithDES = function(data, key) {
const cipher = crypto.createCipheriv('des-cbc', key, iv);
return Buffer.concat([cipher.update(data), cipher.final()]);
};
五、总结
Video.js-contrib-hls是一款强大的HLS流媒体播放插件,提供了许多实用的功能,例如级联字幕、自动清晰度切换、钩子函数等等,可以让我们更加方便地实现自定义的播放器。