国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

videojs 實現(xiàn)自定義組件(視頻畫質(zhì)/清晰度切換) React

這篇具有很好參考價值的文章主要介紹了videojs 實現(xiàn)自定義組件(視頻畫質(zhì)/清晰度切換) React。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

最近使用videojs作為視頻處理第三方庫,用來對接m3u8視頻類型。這里總結(jié)一下自定義組件遇到的問題及實現(xiàn),目前看了許多文章也不全,官方文檔寫的也不是很詳細(xì),自己摸索了一段時間陸陸續(xù)續(xù)完成了,這是實現(xiàn)后的效果.

videojs 實現(xiàn)自定義組件(視頻畫質(zhì)/清晰度切換) React,react.js,音視頻,javascript

樣式啥的自己檢查后覆蓋就行了,沒啥說的,重點看看畫質(zhì)切換這個組件如何實現(xiàn)的。最開始我是采用函數(shù)組件直接嵌入進(jìn)去,后面發(fā)現(xiàn)是報錯的,原因是hook使用范圍有誤,找了半天也不知道是什么原因。后面采用繼承Videojs內(nèi)的menu組件來實現(xiàn)。

代碼實現(xiàn)

option配置如下

 const options: any = {
    controls: true,
    preload: 'auto',
    language: 'zh-CN',
    width: 854,
    height: 480,
    playbackRates: [0.5, 0.75, 1, 1.5, 2], // 倍速數(shù)組
    controlBar: {
      children: {
        PlayToggle: true,
        CurrentTimeDisplay: true,
        DurationDisplay: true,
        ProgressControl: true,
        Quality: true,
        PlaybackRateMenuButton: true,
        volumePanel: {
          inline: false,
        },
        PictureInPictureToggle: true,
        FullscreenToggle: true,
      },
    },
  }

video組件

import { ForwardedRef, forwardRef, useEffect, useImperativeHandle, useRef } from 'react'
import videojs from 'video.js'
import Quality from './quality'

import './index.less'

interface videoComProps {
  videoOptions: any
  onReady: (player: any) => void
  src?: string
}

const VideoWrapper = (props: videoComProps, ref: ForwardedRef<any>) => {
  const { videoOptions, onReady, src } = props
  const videoRef = useRef<any>(null)
  const playerRef = useRef<any>(null)

  function toggleTv(obj: any) {
    const player = playerRef?.current
    if (!player) return
    player.src(obj.src)
    player.load(obj.load)
    player.play()
  }

  useEffect(() => {
    if (!playerRef?.current && videoRef.current) {
      // 注冊組件  一定要在使用之前注冊哦
      videojs.registerComponent('Quality', Quality as any)
      // 初始化video
      const player = (playerRef.current = videojs(videoRef.current, videoOptions, () => {
        onReady(player)
      }))
    }
  }, [videoRef])

  useEffect(() => {
    const player = playerRef.current
    return () => {
      // 組件銷毀的時候,銷毀視頻播放器的實例
      if (player && !player.isDisposed()) {
        player.dispose()
        playerRef.current = null
      }
    }
  }, [playerRef])

  // ref拋出變量
  useImperativeHandle(ref, () => ({
    toggleTv,
  }))

  return (
    <div className="video-wrapper">
      <video
        ref={videoRef}
        className="video-js vjs-big-play-centered"
      >
        <source src={src} />
        {/* <span>視頻走丟了,請稍后再試</span> */}
      </video>
    </div>
  )
}

export default forwardRef(VideoWrapper)

自定義組件

// 切換視頻清晰度代碼
import videoJs from 'video.js'
import { createRoot } from 'react-dom/client'

// 初始化清晰度按鈕
const TextTrackMenuItem: any = videoJs.getComponent('TextTrackMenuItem')
const TrackButton: any = videoJs.getComponent('TrackButton')
const videoQuality = '超清,高清,自動'

class QualityTrackItem extends TextTrackMenuItem {
  constructor(player: any, options: any) {
    super(player, options)
    this.mount = this.mount.bind(this)
    player.ready(() => {
      this.mount()
    })
    this.on('dispose', () => {
      this.root.unmount()
    })
    if (options.index === 2) {
      this.addClass('vjs-selected')
    }
  }
  // 切換高清播放源,this 指向被點擊QualityTrackItem實例
  handleClick(event: any) {
    // 先將所有選項的選中狀態(tài)設(shè)為未選中
    this.parentComponent_.children_.forEach((c: any) => {
      c.selected(false)
    })
    // 選中當(dāng)前
    this.selected(true)
    // 選中后修改按鈕文本
    const btn = document.querySelector('.vjs-menu-button .vjs-icon-placeholder')
    if (!btn) return
    btn.innerHTML = this.track.label
    // 其他邏輯 通知修改視頻源地址進(jìn)行切換
    console.log('切換視頻源')
  }
  mount() {
    this.root = createRoot(this.el()).render(<div>{this.track.label}</div>)
  }
}
// 擴(kuò)展基類,實現(xiàn)菜單按鈕
class QualityTrackButton extends TrackButton {
  constructor(player: any, options: any) {
    super(player, options)
    this.controlText('畫質(zhì)選擇')
    this.children()[0].el().firstElementChild.innerText = '自動'
    this.addClass('vjs-quality')
  }
  createItems() {
    const qualityKeyArray = videoQuality.split(',')
    if (qualityKeyArray.length > 0) {
      const result: any = []
      qualityKeyArray.forEach((key, index: number) => {
        result.push(
          new QualityTrackItem(this.player_, {
            track: {
              label: key,
              value: key,
            },
            selectable: true,
            index,
          })
        )
      })
      return result
    } else {
      return []
    }
  }
}

export default QualityTrackButton

可能遇到的問題

1.卸載不了對應(yīng)事件

  const handleUpdate = useCallback(() => {
    const player = playerRef.current
    //window.document.fullscreenElement檢測視頻是否正在全屏
    // console.log('播放中,當(dāng)前時間是', player.currentTime())
    if (player.currentTime() > 10) {
      if (window.document.fullscreenElement) {
        // 如果是全屏 退出全屏
        window.document.exitFullscreen()
      }
      player.currentTime(10)
      setOverlay(true)
      player.pause()
    }
  }, [])
  
useEffect(() => {
    if (!playerRef?.current && videoRef.current) {
      // 注冊組件  一定要在使用之前注冊哦
      videojs.registerComponent('Quality', Quality as any)
      // 初始化video
      const player = (playerRef.current = videojs(videoRef.current, videoOptions, () => {
        onReady(player)
      }))
      playFlag && player.on('timeupdate', handleUpdate)
    }
  }, [videoRef])

  // 加入學(xué)習(xí)
  const handelAddLearn = () => {
    const player = playerRef.current
    player.off('timeupdate', handleUpdate)
    setPlayFlag(false)
    setOverlay(false)
    player.play()
  }

把對應(yīng)需要卸載的事件采用useCallback進(jìn)行處理,這樣的事件的地址就不會變化造成卸載失效的問題

END

希望能幫到正在開發(fā)的伙伴們文章來源地址http://www.zghlxwxcb.cn/news/detail-677645.html

到了這里,關(guān)于videojs 實現(xiàn)自定義組件(視頻畫質(zhì)/清晰度切換) React的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • html5視頻播放器代碼實例(含倍速、清晰度切換、續(xù)播)

    html5視頻播放器代碼實例(含倍速、清晰度切換、續(xù)播)

    本文將對視頻播放相關(guān)的功能進(jìn)行說明(基于云平臺),包括初始化播放器、播放器尺寸設(shè)置、視頻切換、倍速切換、視頻預(yù)覽、自定義視頻播放的開始/結(jié)束時間、禁止拖拽進(jìn)度、播放器皮膚、控件按鈕以及播放控制等。 ?圖 / html5視頻播放器調(diào)用效果(倍速切換) ? ?圖

    2024年02月06日
    瀏覽(29)
  • 分享視頻畫質(zhì)修復(fù)方法,視頻畫面由模糊變清晰

    分享視頻畫質(zhì)修復(fù)方法,視頻畫面由模糊變清晰

    童年經(jīng)典電視劇重新上映,黃家駒演唱會31年后重映這些都是最近飽受大家關(guān)注的重大事件。而這些都是基于AI視頻修復(fù)還原當(dāng)初的美好,讓記憶重現(xiàn)。也是由此發(fā)現(xiàn),AI修復(fù)技術(shù)漸漸的也還是走入大家的視野,那面對家里哪些老舊的視頻,我們是否也可以進(jìn)行高清修復(fù)呢?

    2024年02月16日
    瀏覽(19)
  • Python - Real-ESRGAN 提升圖像、視頻清晰度 - 最高可達(dá) 4 K

    Python - Real-ESRGAN 提升圖像、視頻清晰度 - 最高可達(dá) 4 K

    目錄 一.引言 二.Real-ESRGAN 理論 1.模型簡介 2.經(jīng)典退化模型 ◆?退化過程全覽 ◆ K - 高斯濾波 ◆ N - 噪聲 ◆ ↓r - Resize ◆ jpeg - 壓縮 3.高階退化模型 4.環(huán)形和超調(diào)偽影 5.網(wǎng)絡(luò)結(jié)構(gòu) ◆?ESRGAN 生成器 ◆?U-Net 鑒別器 三.Real-ESRGAN 實戰(zhàn) 1.快速體驗 2.環(huán)境搭建 ◆?Package 安裝 ◆?預(yù)訓(xùn)練

    2024年02月04日
    瀏覽(23)
  • 解決moviepy保存的視頻畫質(zhì)不清晰問題

    參考: https://blog.csdn.net/mhack5200/article/details/128666918 https://www.cnblogs.com/LaoYuanPython/p/13643497.html moviepy 函數(shù)庫很坑,默認(rèn)值比較低,要提高保存圖像的清晰度,提高 bitrate 就好,這點指定 4000k 或者 8000k 就行了 如, bitrate=\\\'8000k\\\' 具體如下: ImageSequenceClip 是 moviepy 庫中的一個類,用

    2024年04月14日
    瀏覽(27)
  • Unity通過改變文本Rect長寬以及縮放來改善Text(Legacy)的清晰度思路,操作以及代碼實現(xiàn)

    Unity通過改變文本Rect長寬以及縮放來改善Text(Legacy)的清晰度思路,操作以及代碼實現(xiàn)

    前情:在最近做的一個比較大的項目中,客戶要求導(dǎo)入各種圖片以及文字。在1920X1080的情況下是采用了42號字體,提供項目后得到的反饋卻是字體太糊,經(jīng)詢問得知1920X1080分辨率并不是使用在電腦上,而是在屏幕特別大的仿真機(jī)上運(yùn)行,貼近看確實很糊,但是這個項目使用的Text(L

    2024年01月25日
    瀏覽(44)
  • 你知道照片怎么變清晰嗎?增強(qiáng)照片清晰度的方法

    你知道照片怎么變清晰嗎?增強(qiáng)照片清晰度的方法

    相信很多小伙伴都會有這種的經(jīng)歷,去游玩時高高興興的拍照留念,結(jié)果拍出來的照片不是很盡人意?;蛘呤钱嬅孢€沒聚焦好,就按下快門,導(dǎo)致拍攝出來的照片變模糊了。很多小伙伴遇到這種情況都很煩惱,照片丟了可惜,不丟看著模糊的照片又很難受。其實我們可以通過

    2024年02月08日
    瀏覽(19)
  • 如何使用AI圖片清晰度增強(qiáng)器軟件增強(qiáng)和銳化圖片、提高照片清晰度并去除噪點

    如何使用AI圖片清晰度增強(qiáng)器軟件增強(qiáng)和銳化圖片、提高照片清晰度并去除噪點

    通過使用深度學(xué)習(xí)AI算法對照片進(jìn)行批量銳化、去噪和去模糊處理,該程序可以應(yīng)用再大部分照片和圖片,包括徽標(biāo)、卡通和動漫 可能很多朋友都會遇到需要批量增強(qiáng)和銳化照片的情況:例如,如果拍攝過程中曝光不足、夜晚噪點多或者畫面模糊等等。普通的照片處理軟件使

    2024年02月06日
    瀏覽(20)
  • 解決Canvas畫圖清晰度問題

    解決Canvas畫圖清晰度問題

    最近在開發(fā)Web端遠(yuǎn)程桌面的時候遇到的一個問題,解決記錄一下,分享給各位有需要用到的朋友。 先吹下水:遠(yuǎn)程桌面的連接我們是通過Websocket連接后,后端不斷返回遠(yuǎn)程端的界面二進(jìn)制數(shù)據(jù)流,我接收到之后轉(zhuǎn)為圖像,畫到Canvas中,然后對canvas進(jìn)行一系列的事件監(jiān)聽,傳遞

    2024年01月21日
    瀏覽(27)
  • WebRTC清晰度和流暢度

    WebRTC清晰度和流暢度 flyfish WebRTC提供了4種模式DISABLED,MAINTAIN_FRAMERATE,MAINTAIN_RESOLUTION,BALANCED 接口是 根據(jù)源碼 接口這里不是一一對應(yīng)的kDetailed和kText是類似的 使用方法 上述代碼video_track創(chuàng)建好之后,調(diào)用 參考 https://w3c.github.io/webrtc-pc/#idl-def-rtcdegradationpreference https://crbug.co

    2024年02月10日
    瀏覽(22)
  • Halcon清晰度檢測Demo

    此實例通過使用Halcon實現(xiàn)5種清晰度算法函數(shù): 1. 方差算法函數(shù); 2. 拉普拉斯能量函數(shù); 3. 能量梯度函數(shù); 4. Brenner函數(shù); 5. Tenegrad函數(shù); 測試效果如下圖片;找到峰值對應(yīng)的那張圖,確實是最清晰的那張;使用直方圖顯示清晰度結(jié)果,如果有更好的方法,那就跟帖回復(fù)吧。

    2023年04月25日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包