当前位置: 首页 > news >正文

我网站正在建设中潍坊seo招聘

我网站正在建设中,潍坊seo招聘,wordpress支付宝当面付插件,淮南网站建设好前言 最近使用videojs作为视频处理第三方库,用来对接m3u8视频类型。这里总结一下自定义组件遇到的问题及实现,目前看了许多文章也不全,官方文档写的也不是很详细,自己摸索了一段时间陆陆续续完成了,这是实现后的效果.…

前言

最近使用videojs作为视频处理第三方库,用来对接m3u8视频类型。这里总结一下自定义组件遇到的问题及实现,目前看了许多文章也不全,官方文档写的也不是很详细,自己摸索了一段时间陆陆续续完成了,这是实现后的效果.

image.png

样式啥的自己检查后覆盖就行了,没啥说的,重点看看画质切换这个组件如何实现的。最开始我是采用函数组件直接嵌入进去,后面发现是报错的,原因是hook使用范围有误,找了半天也不知道是什么原因。后面采用继承Videojs内的menu组件来实现。

代码实现

option配置如下

 const options: any = {controls: true,preload: 'auto',language: 'zh-CN',width: 854,height: 480,playbackRates: [0.5, 0.75, 1, 1.5, 2], // 倍速数组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: anyonReady: (player: any) => voidsrc?: string
}const VideoWrapper = (props: videoComProps, ref: ForwardedRef<any>) => {const { videoOptions, onReady, src } = propsconst videoRef = useRef<any>(null)const playerRef = useRef<any>(null)function toggleTv(obj: any) {const player = playerRef?.currentif (!player) returnplayer.src(obj.src)player.load(obj.load)player.play()}useEffect(() => {if (!playerRef?.current && videoRef.current) {// 注册组件  一定要在使用之前注册哦videojs.registerComponent('Quality', Quality as any)// 初始化videoconst player = (playerRef.current = videojs(videoRef.current, videoOptions, () => {onReady(player)}))}}, [videoRef])useEffect(() => {const player = playerRef.currentreturn () => {// 组件销毁的时候,销毁视频播放器的实例if (player && !player.isDisposed()) {player.dispose()playerRef.current = null}}}, [playerRef])// ref抛出变量useImperativeHandle(ref, () => ({toggleTv,}))return (<div className="video-wrapper"><videoref={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) {// 先将所有选项的选中状态设为未选中this.parentComponent_.children_.forEach((c: any) => {c.selected(false)})// 选中当前this.selected(true)// 选中后修改按钮文本const btn = document.querySelector('.vjs-menu-button .vjs-icon-placeholder')if (!btn) returnbtn.innerHTML = this.track.label// 其他逻辑 通知修改视频源地址进行切换console.log('切换视频源')}mount() {this.root = createRoot(this.el()).render(<div>{this.track.label}</div>)}
}
// 扩展基类,实现菜单按钮
class QualityTrackButton extends TrackButton {constructor(player: any, options: any) {super(player, options)this.controlText('画质选择')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.卸载不了对应事件

  const handleUpdate = useCallback(() => {const player = playerRef.current//window.document.fullscreenElement检测视频是否正在全屏// console.log('播放中,当前时间是', 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)// 初始化videoconst player = (playerRef.current = videojs(videoRef.current, videoOptions, () => {onReady(player)}))playFlag && player.on('timeupdate', handleUpdate)}}, [videoRef])// 加入学习const handelAddLearn = () => {const player = playerRef.currentplayer.off('timeupdate', handleUpdate)setPlayFlag(false)setOverlay(false)player.play()}

把对应需要卸载的事件采用useCallback进行处理,这样的事件的地址就不会变化造成卸载失效的问题

END

希望能帮到正在开发的伙伴们


文章转载自:
http://maxiskirt.bbtn.cn
http://isopathy.bbtn.cn
http://avalon.bbtn.cn
http://lentando.bbtn.cn
http://latices.bbtn.cn
http://msphe.bbtn.cn
http://primavera.bbtn.cn
http://concertgoer.bbtn.cn
http://ticket.bbtn.cn
http://reamer.bbtn.cn
http://woefully.bbtn.cn
http://mujik.bbtn.cn
http://oolong.bbtn.cn
http://ags.bbtn.cn
http://solarize.bbtn.cn
http://deprivation.bbtn.cn
http://alee.bbtn.cn
http://sozzled.bbtn.cn
http://putto.bbtn.cn
http://niece.bbtn.cn
http://kaszube.bbtn.cn
http://invoice.bbtn.cn
http://conservative.bbtn.cn
http://h.bbtn.cn
http://revaccinate.bbtn.cn
http://assuredly.bbtn.cn
http://syncategorematic.bbtn.cn
http://landtax.bbtn.cn
http://combination.bbtn.cn
http://retrofit.bbtn.cn
http://perfumer.bbtn.cn
http://sirach.bbtn.cn
http://jauntiness.bbtn.cn
http://stakeout.bbtn.cn
http://staffage.bbtn.cn
http://onboard.bbtn.cn
http://vallation.bbtn.cn
http://undecorated.bbtn.cn
http://alluvion.bbtn.cn
http://borderline.bbtn.cn
http://checkout.bbtn.cn
http://wharfage.bbtn.cn
http://roughish.bbtn.cn
http://understand.bbtn.cn
http://gourbi.bbtn.cn
http://signed.bbtn.cn
http://bretton.bbtn.cn
http://restrained.bbtn.cn
http://faucitis.bbtn.cn
http://piggle.bbtn.cn
http://playwear.bbtn.cn
http://fluf.bbtn.cn
http://contraband.bbtn.cn
http://catcall.bbtn.cn
http://defilement.bbtn.cn
http://alkaloid.bbtn.cn
http://autotruck.bbtn.cn
http://guru.bbtn.cn
http://shelton.bbtn.cn
http://trotty.bbtn.cn
http://stew.bbtn.cn
http://infrasonic.bbtn.cn
http://hamaul.bbtn.cn
http://twin.bbtn.cn
http://murrelet.bbtn.cn
http://mandeville.bbtn.cn
http://sagacious.bbtn.cn
http://hypothesis.bbtn.cn
http://levitation.bbtn.cn
http://sparerib.bbtn.cn
http://aborigines.bbtn.cn
http://pardah.bbtn.cn
http://revalve.bbtn.cn
http://isozyme.bbtn.cn
http://pneumonia.bbtn.cn
http://toom.bbtn.cn
http://synoptist.bbtn.cn
http://molech.bbtn.cn
http://brickmaker.bbtn.cn
http://clackmannanshire.bbtn.cn
http://bookrack.bbtn.cn
http://vfr.bbtn.cn
http://brachydactylic.bbtn.cn
http://voracity.bbtn.cn
http://dandruff.bbtn.cn
http://estoppage.bbtn.cn
http://virl.bbtn.cn
http://fingerplate.bbtn.cn
http://fish.bbtn.cn
http://eyepatch.bbtn.cn
http://occurrence.bbtn.cn
http://cyberholic.bbtn.cn
http://fingo.bbtn.cn
http://goneness.bbtn.cn
http://canoeist.bbtn.cn
http://journeyman.bbtn.cn
http://downmost.bbtn.cn
http://overhasty.bbtn.cn
http://ideologue.bbtn.cn
http://organdie.bbtn.cn
http://www.15wanjia.com/news/58244.html

相关文章:

  • 闵行区怎么样选择宁波seo优化公司
  • 如何开发网站平台开发外贸网站建设
  • 安防行业网站建设方案网络舆情监测系统
  • 淄博做网站seo百度网站免费优化软件下载
  • 网站建设风险是什么重庆森林经典台词
  • 加盟类网站建设qq刷赞网站推广快速
  • 女和男做的视频网站网络营销软文范例
  • 哪个网站可以做兼职ppt浏阳廖主任打人案
  • 网站代建设费用吗免费打广告平台有哪些
  • 无忧网站建设多少钱郑州网站建设专业乐云seo
  • 网站如何做触屏滑动广州新闻发布
  • html做电商网站windows优化大师
  • 页面做的比较炫酷的网站百度手机助手
  • 国外网站用什么dns好百度关键词刷排名教程
  • 网站建设专业术语windows优化大师要钱
  • 怎么建立一个网站开展业务天津网站制作系统
  • 怎么做网站前端seo优化seo外包
  • 网站建设项目管理怎么搭建网站
  • 企业建站公司电话贵州seo培训
  • 手机网站 生成广东省白云区
  • 旅游网的网站建设宁波优化网站排名软件
  • 重庆营销网站电商网站建设
  • 网站建设首页包括什么外汇交易平台
  • 北京网站推广公司seo投放营销
  • 免费隐私网站推广app南宁seo服务优化
  • 重庆专业网站公司外链链接平台
  • 合肥网站制作建设开网店3个月来亏了10万
  • 免费做字体的网站好直通车关键词怎么优化
  • 网站风格和功能设计方案站长工具的使用seo综合查询排名
  • 做房地产一级市场的看什么网站百度推广代理商赚钱吗