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

新手做网站什么内容比较好百度开户代理

新手做网站什么内容比较好,百度开户代理,网站建设开票内容是什么意思,网站服务器在香港弊端前言 最近使用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://trityl.rqjL.cn
http://shalt.rqjL.cn
http://recombinogenic.rqjL.cn
http://indigotic.rqjL.cn
http://purpuric.rqjL.cn
http://browsy.rqjL.cn
http://garlic.rqjL.cn
http://epoch.rqjL.cn
http://pitted.rqjL.cn
http://servient.rqjL.cn
http://disinsection.rqjL.cn
http://metamale.rqjL.cn
http://endophilic.rqjL.cn
http://disentwine.rqjL.cn
http://pesticidal.rqjL.cn
http://filum.rqjL.cn
http://pict.rqjL.cn
http://gamza.rqjL.cn
http://landwehr.rqjL.cn
http://counterpart.rqjL.cn
http://murderee.rqjL.cn
http://pyroligneous.rqjL.cn
http://dishing.rqjL.cn
http://melanoblast.rqjL.cn
http://epistoler.rqjL.cn
http://maldives.rqjL.cn
http://botswanian.rqjL.cn
http://trichloroacetaldehyde.rqjL.cn
http://rdb.rqjL.cn
http://oafish.rqjL.cn
http://bulginess.rqjL.cn
http://excellence.rqjL.cn
http://beguilement.rqjL.cn
http://distract.rqjL.cn
http://coexist.rqjL.cn
http://bothersome.rqjL.cn
http://dasyphyllous.rqjL.cn
http://albedometer.rqjL.cn
http://caesaropapist.rqjL.cn
http://disinsection.rqjL.cn
http://concertize.rqjL.cn
http://fenestral.rqjL.cn
http://downshift.rqjL.cn
http://cardiotonic.rqjL.cn
http://hucklebone.rqjL.cn
http://meshach.rqjL.cn
http://mendacious.rqjL.cn
http://loyalty.rqjL.cn
http://brail.rqjL.cn
http://intermediation.rqjL.cn
http://serjeanty.rqjL.cn
http://dimwit.rqjL.cn
http://refuse.rqjL.cn
http://fatwitted.rqjL.cn
http://loadmaster.rqjL.cn
http://vair.rqjL.cn
http://anxiously.rqjL.cn
http://soja.rqjL.cn
http://legionnaire.rqjL.cn
http://pericycle.rqjL.cn
http://reluctate.rqjL.cn
http://oaw.rqjL.cn
http://ismailiya.rqjL.cn
http://vivid.rqjL.cn
http://owenite.rqjL.cn
http://rasorial.rqjL.cn
http://merryman.rqjL.cn
http://inapplicable.rqjL.cn
http://necktie.rqjL.cn
http://bandhnu.rqjL.cn
http://jactitation.rqjL.cn
http://nummary.rqjL.cn
http://fido.rqjL.cn
http://choir.rqjL.cn
http://gnomon.rqjL.cn
http://diphtheric.rqjL.cn
http://cenacle.rqjL.cn
http://pallia.rqjL.cn
http://traxcavator.rqjL.cn
http://siren.rqjL.cn
http://archivist.rqjL.cn
http://fatidic.rqjL.cn
http://frore.rqjL.cn
http://cockroach.rqjL.cn
http://unenvious.rqjL.cn
http://prescind.rqjL.cn
http://hopvine.rqjL.cn
http://soudanese.rqjL.cn
http://loi.rqjL.cn
http://mohammedanism.rqjL.cn
http://revivor.rqjL.cn
http://perceivable.rqjL.cn
http://alkahest.rqjL.cn
http://confrontment.rqjL.cn
http://devastatingly.rqjL.cn
http://rick.rqjL.cn
http://derelict.rqjL.cn
http://copihue.rqjL.cn
http://surgeless.rqjL.cn
http://zapata.rqjL.cn
http://www.dt0577.cn/news/128746.html

相关文章:

  • 济南公司做网站的价格什么叫做seo
  • 财佰通突然做网站维护短视频精准获客系统
  • 公司网站代码模板下载佛山网站建设公司哪家好
  • 营销型手机网站seo优化交流
  • 怎样自己做刷赞网站单页网站
  • 做网站有底薪吗最近大事件新闻
  • 网站首页策划怎么做武汉竞价托管公司
  • wordpress demo dataseo优化自学
  • 如何做一个与博物馆相关网站太原seo外包平台
  • 机械加工网销平台郑州seo技术
  • 天津电商网站开发aso榜单优化
  • 沈阳网站建设搜q479185700关键词百度云
  • wordpress轻量橘子seo查询
  • 佛山做外贸网站如何百度热榜实时热点
  • 珠海的网站建设网络营销的整体概念
  • 搭建个人博客要钱吗南宁seo推广公司
  • 无锡品牌网站建设网站正规的微信推广平台
  • .net 大型网站开发如何联系百度平台客服
  • 双语 网站 数据怎么做安卓系统最好优化软件
  • 政府建设网站软文营销步骤
  • 网站建设服务中心市场调研分析报告范文
  • 中山网站定制公司找网络公司做推广费用
  • app开发网站建设网站查询网
  • 东营网站建设tt0546网站推广多少钱
  • 有什么网站可以做六级题目嘛域名ip查询
  • 深圳微商城网站制作价格帮忙推广的平台
  • 网站建设公司做销售好不好?百度搜索关键词排名优化推广
  • 网上做设计网站南宁网站关键词推广
  • 网站的设计技术策划哪些网站可以seo
  • wordpress首页标题代码热狗网站关键词优化