流量变现70%分成 全国楼凤小姐姐 招商联系客服 招商联系客服 招商联系客服 招商联系客服

NPlayerH5弹幕播放器-清晰度切换

[复制链接]
查看134 | 回复0 | 2024-10-16 11:25:32 | 显示全部楼层 |阅读模式
清晰度切换


这个例子是使用 ControlItem 来实现视频的清晰度切换功能,这里使用 HLS,来切换视频清晰度。


  1. import Player, { Popover } from "nplayer"
  2. import Hls from "hls.js"

  3. // 1. 首先创建一个控制条项
  4. const Quantity = {
  5.   el: document.createElement("div"),
  6.   init() {
  7.     this.btn = document.createElement("div")
  8.     this.btn.textContent = "画质";
  9.     this.el.appendChild(this.btn)
  10.     this.popover = new Popover(this.el)
  11.     this.btn.addEventListener("click", () => this.popover.show())
  12.     // 点击按钮的时候展示 popover
  13.     this.el.style.display = "none"
  14.     // 默认隐藏
  15.     this.el.classList.add("quantity")
  16.   }
  17. }

  18. // 2. 我们把它放到 spacer 后面
  19. window.player = new Player({
  20.   controls: [
  21.     [
  22.       "play",
  23.       "volume",
  24.       "time",
  25.       "spacer",
  26.       Quantity,
  27.       "airplay",
  28.       "settings",
  29.       "web-fullscreen",
  30.       "fullscreen"
  31.     ],
  32.     ["progress"]
  33.   ]
  34. })

  35. // 3. 创建 HLS 实例
  36. const hls = new Hls()
  37. hls.on(Hls.Events.MEDIA_ATTACHED, function () {
  38.   hls.on(Hls.Events.MANIFEST_PARSED, function () {
  39.     // 4. 给清晰度排序,清晰度越高的排在最前面
  40.     hls.levels.sort((a, b) => b.height - a.height)
  41.     const frag = document.createDocumentFragment()
  42.     // 5. 给与清晰度对应的元素添加,点击切换清晰度功能
  43.     const listener = (i) => (init) => {
  44.       const last = Quantity.itemElements[Quantity.itemElements.length - 1]
  45.       const prev = Quantity.itemElements[Quantity.value] || last
  46.       const el = Quantity.itemElements[i] || last
  47.       prev.classList.remove("quantity_item-active")
  48.       el.classList.add("quantity_item-active")
  49.       Quantity.btn.textContent = el.textContent
  50.       if (init !== true && !window.player.paused)
  51.         setTimeout(() => window.player.play())
  52.       // 因为 HLS 切换清晰度会使正在播放的视频暂停,我们这里让它再自动恢复播放
  53.       Quantity.value = hls.currentLevel = hls.loadLevel = i
  54.       Quantity.popover.hide()
  55.     }
  56.     // 6. 添加清晰度对应元素
  57.     Quantity.itemElements = hls.levels.map((l, i) => {
  58.       const el = document.createElement("div")
  59.       el.textContent = l.name + "P"
  60.       if (l.height === 1080) el.textContent += " 超清"
  61.       if (l.height === 720) el.textContent += " 高清"
  62.       if (l.height === 480) el.textContent += " 清晰"
  63.       el.classList.add("quantity_item")
  64.       el.addEventListener("click", listener(i))
  65.       frag.appendChild(el)
  66.       return el
  67.     })

  68.     const el = document.createElement("div")
  69.     el.textContent = "自动"
  70.     el.addEventListener("click", listener(-1))
  71.     el.classList.add("quantity_item")
  72.     frag.appendChild(el)
  73.     Quantity.itemElements.push(el)
  74.     // 这里再添加一个 `自动` 选项,HLS 默认是根据网速自动切换清晰度

  75.     Quantity.popover.panelEl.appendChild(frag)
  76.     Quantity.el.style.display = "block"

  77.     listener(hls.currentLevel)(true)
  78.     // 初始化当前清晰度
  79.   });

  80.   // 绑定 video 元素成功的时候,去加载视频
  81.   hls.loadSource("https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8");
  82. })

  83. hls.attachMedia(window.player.video)
  84. window.player.mount("#app")
复制代码

  1. .quantity {
  2.   position: relative;
  3.   padding: 0 8px;
  4.   cursor: pointer;
  5.   font-size: 14px;
  6.   font-weight: bold;
  7.   white-space: nowrap;
  8.   opacity: 0.8;
  9. }
  10. .quantity:hover {
  11.   opacity: 1;
  12. }
  13. .quantity_item {
  14.   padding: 5px 20px;
  15.   font-weight: normal;
  16. }
  17. .quantity_item:hover {
  18.   background: rgba(255, 255, 255, 0.3);
  19. }
  20. .quantity_item-active {
  21.   color: var(--theme-color);
  22. }
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则