【发布时间】:2026-02-06 20:10:01
【问题描述】:
我使用plyr 作为 HTML5 视频标签的包装器,并使用 Hls.js 流式传输我的 .m3u8 视频。
我在 plyr 上解决了很多问题以启用质量选择器,并遇到了多个 PR,这些 PR 有这个问题但被关闭说实现已合并,直到我发现这个 PR 说它仍然是开放的,但是评论中有一个自定义实现,可以确保它有效。我正在本地尝试该实现,以检查我们是否可以添加质量选择器,但似乎我缺少某些东西/或实现不工作。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>HLS Demo</title>
<link rel="stylesheet" href="https://cdn.plyr.io/3.5.10/plyr.css" />
<style>
body {
max-width: 1024px;
}
</style>
</head>
<body>
<video preload="none" id="player" autoplay controls crossorigin></video>
<script src="https://cdn.plyr.io/3.5.10/plyr.js"></script>
<script src="https://cdn.jsdelivr.net/hls.js/latest/hls.js"></script>
<script>
(function () {
var video = document.querySelector('#player');
var playerOptions= {
quality: {
default: '720',
options: ['720']
}
};
var player;
player = new Plyr(video,playerOptions);
if (Hls.isSupported()) {
var hls = new Hls();
hls.loadSource('https://content.jwplatform.com/manifests/vM7nH0Kl.m3u8');
//hls.loadSource('https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8');
hls.attachMedia(video);
hls.on(Hls.Events.MANIFEST_PARSED,function(event,data) {
// uncomment to see data here
// console.log('levels', hls.levels); we get data here but not able to see in settings .
playerOptions.quality = {
default: hls.levels[hls.levels.length - 1].height,
options: hls.levels.map((level) => level.height),
forced: true,
// Manage quality changes
onChange: (quality) => {
console.log('changes',quality);
hls.levels.forEach((level, levelIndex) => {
if (level.height === quality) {
hls.currentLevel = levelIndex;
}
});
}
};
});
}
// Start HLS load on play event
player.on('play', () => hls.startLoad());
// Handle HLS quality changes
player.on('qualitychange', () => {
console.log('changed');
if (player.currentTime !== 0) {
hls.startLoad();
}
});
})();
</script>
</body>
</html>
上面的 sn-p 作品请运行,但如果你取消注释 在 HLS Manifest 中,您将看到我们在级别中获取数据并通过 玩家选项的数据,但它没有出现在设置中。如何 我们在使用 Hls 流时向 plyr 添加了一个质量选择器。
【问题讨论】:
标签: javascript html5-video plyr http-live-streaming