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

东莞手机网站设计公司开源低代码

东莞手机网站设计公司,开源低代码,百度一下你就知道下载,中国体育新闻热点前言 最近使用videojs作为视频处理第三方库#xff0c;用来对接m3u8视频类型。这里总结一下自定义组件遇到的问题及实现#xff0c;目前看了许多文章也不全#xff0c;官方文档写的也不是很详细#xff0c;自己摸索了一段时间陆陆续续完成了#xff0c;这是实现后的效果.…前言 最近使用videojs作为视频处理第三方库用来对接m3u8视频类型。这里总结一下自定义组件遇到的问题及实现目前看了许多文章也不全官方文档写的也不是很详细自己摸索了一段时间陆陆续续完成了这是实现后的效果. 样式啥的自己检查后覆盖就行了没啥说的重点看看画质切换这个组件如何实现的。最开始我是采用函数组件直接嵌入进去后面发现是报错的原因是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 ./qualityimport ./index.lessinterface videoComProps {videoOptions: anyonReady: (player: any) voidsrc?: string }const VideoWrapper (props: videoComProps, ref: ForwardedRefany) {const { videoOptions, onReady, src } propsconst videoRef useRefany(null)const playerRef useRefany(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 classNamevideo-wrappervideoref{videoRef}classNamevideo-js vjs-big-play-centeredsource 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://wiki.neutronadmin.com/news/177828/

相关文章:

  • 需要个网站淮南城乡建设局网站
  • 福州百度做网站多少钱做教育业网站
  • 企业网站开发信息html自动播放视频
  • asp网站如何打开受欢迎的邢台做网站
  • 国内 上市网站建设公司排名合肥做拼拼团网站的公司
  • 网站魔板大全昆明做凡科网站
  • 分类网站怎么做项目外贸网站模板免费
  • 曼朗策划网站建设商场设计费
  • 百度网站推广一年多少钱自己开发软件大概需要多少钱
  • 广州网站建设市场西宁网站建设公司排行
  • seo是什么品牌seo快速排名服务
  • 广州微信网站开发公司企业网站搭建新感觉建站
  • 池州市建设工程质量安全监督局网站自家电脑做网站服务器w7花生壳
  • 做淘宝客需要网站吗杭州网站建设响应式
  • 护肤品 网站建设策划书合肥广告牌制作公司
  • 广州骏域网站建设专家电子商务公司属于什么行业
  • 欧美色影网站经典logo设计案例分析
  • 速升网站网站设计需要学什么软件
  • php违章网站开发购物网站开发需求分析
  • 望城区网站建设wordpress 微站
  • 网站建设商务代表工作总结生态建筑建设公司网站
  • 网站空间是不是服务器网站建设公司 合肥
  • 如何让域名跳转网站网站开发按几年摊销
  • 风铃网站代做潍坊网站搜索引擎优化
  • 电子商务企业网站的推广方式加油站网站建设
  • 云南网站营销网站推广策划的思路包括哪些
  • 专做零食的网站C 如何做简易网站
  • 微信 wordpress搜索seo网站推广的目的包括哪个方面
  • 如何修改网站备案网站建设优化是什么鬼
  • 北京网站建站系统平台南宁seo网络推广