基于videoPlayer实现视频播放联动文字播报功能

简介: 基于videoPlayer实现视频播放联动文字播报功能

需要自行准备一个视频文件,并且提取视频中的文字内容,文字内容包含时间跟文字的切分,即按照时间断句的形式,比如[00:05]第一句话,[00:10]第二句话;数据准备好以后,安装videoPlayer,用于播放视频文件。下面就是完整的视频播放与文字内容双向联动的代码:

<template><divclass="app-container"><divstyle="display: flex"><divstyle="width: 65%"><el-cardstyle="margin-top: 10px;">            视频画面
<divclass="demo"><video-playerclass="video-player vjs-custom-skin"ref="videoPlayer":playsinline="true"@timeupdate="onPlayerTimeupdate($event)":options="playerOptions"></video-player></div></el-card></div><divstyle="width: 34%"><el-cardid="cardContent"style="width: 100%;margin-top: 10px;margin-left: 10px;display: block;overflow: auto;"><span>视频文字内容</span><divv-if="contentBlank"style="text-align: center;">暂无数据</div><divv-if="!contentBlank"class="demo1"><divid="container"><divstyle="overflow-y: auto"id="containerContent"><!-- <p style="white-space: pre-line" v-html="dateConList"></p> --><ulstyle="list-style-type:none;margin:0;padding:0"><liv-for="(item,index) in startTimeSentenceList":key="index"><el-link@click="posStartTime(item.startTime)"><pstyle="white-space: pre-line"v-html="item.sentence"></p></el-link></li></ul></div></div></div></el-card></div></div></div></template><script>import { videoPlayer } from"vue-video-player";
import"video.js/dist/video-js.css";
import"videojs-contrib-hls";
exportdefault {
name: "VedioContent",
data() {
return {
currentArray:[],
currentTimeRangeMap:null,
dateConList: "",
startTimeSentenceList:[],
contentBlank: false,
playerOptions: {
playbackRates: [0.5, 1.0, 1.5, 2.0], // 可选的播放速度autoplay: true, // 如果为true,浏览器准备好时开始回放。muted: false, // 默认情况下将会消除任何音频。loop: false, // 是否视频一结束就重新开始。preload: "auto", // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)language: "zh-CN",
aspectRatio: "16:10", // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。sources: [
          {
type: "video/mp4", // 类型src: require("vedio.mp4"), // url地址          },
        ],
poster: "", // 封面地址notSupportedMessage: "此视频暂无法播放,请稍后再试", // 允许覆盖Video.js无法播放媒体源时显示的默认信息。controlBar: {
timeDivider: true, // 当前时间和持续时间的分隔符durationDisplay: true, // 显示持续时间remainingTimeDisplay: false, // 是否显示剩余时间功能fullscreenToggle: true, // 是否显示全屏按钮        }
      },
    };
  },
components: {videoPlayer},
activated() {
this.queryVedioContent();
  },
deactivated() {
  },
methods: {
posStartTime(posStartTime){
letmin=posStartTime.split(":")[0]
letsec=posStartTime.split(":")[1]
letsecNum=Number(min*60)+Number(sec)
this.$refs.videoPlayer.player.currentTime(secNum)
this.$refs.videoPlayer.player.play()
    },
// 当前播放位置发生变化时触发。onPlayerTimeupdate($event) {
letdisplayElm=document.getElementsByClassName("vjs-current-time-display")[0]
if(displayElm!=null&&this.currentTimeRangeMap!=null&&this.currentArray.indexOf(displayElm.textContent)===-1){
letcurrenttime=displayElm.textContentletmin=currenttime.split(":")
if(min[0].length==1){
currenttime="0"+currenttime        }
for(constkeyinthis.currentTimeRangeMap){
if(currenttime>=key&&currenttime<=this.currentTimeRangeMap[key]){
letfocusElement=document.getElementById(key+","+this.currentTimeRangeMap[key])
focusElement.parentElement.style.color="red"          }else{
letdisfocusElement=document.getElementById(key+","+this.currentTimeRangeMap[key])
disfocusElement.parentElement.style.color=""          }
        }
      }
    },
//视频内容分析查看queryVedioContent(id) {
this.contentBlank=false;
this.playerOptions['sources'][0]['src'] ="";
//getContents(query).then((response) => {// if (response.ret === 200) {this.dateConList=response.data.contentval;
this.currentTimeRangeMap=response.data.timeRangeMap;
this.startTimeSentenceList=response.data.startTimeSentenceListthis.playerOptions['sources'][0]['src'] =response.data.vediosrc;
//} else {//  this.playerOptions['sources'][0]['src'] = "";//  this.dateConList = "";//  this.contentBlank = true;// }// });    },
  },
};
</script><stylelang="scss"scoped>.demo{
width: 100%;
height: calc(100vh - 150px);
/deep/video{
object-fit: fill; // 消除播放器两边的黑色留白 (object-fit 知识详见下文拓展部分)  }
/* 视频开始的按钮样式 *//deep/.video-js.vjs-big-play-button{
// border-width: 3px;// border-color: rgb(255, 255, 255);// border-style: solid;// border-radius: 50%;// width: 56px;// height: 56px;// line-height: 50px;background-color: rgba(0,0,0,0);
position: absolute;
// top: 0;// bottom: 0;// left: 0;// right: 0;margin: auto;
  }
/* 滚动条的样式 *//deep/.video-js.vjs-control-bar{
background-color: rgba(43, 51, 63, 0);
  }
/deep/.video-js.vjs-play-progress{
background-color: rgb(238,191,0);
  }
/deep/.video-js.vjs-load-progressdiv{
background-color: rgb(255, 255, 255);
  }
}
.demo1{
width: 100%;
height: calc(100vh - 200px);
}
</style>

主要思想是通过@timeupdate="onPlayerTimeupdate($event)"监控视频播放时间然后找到对应时间的文字内容,通过posStartTime(item.startTime)"再点击时间文字的时候,定位到视频的时间进行播放。

目录
相关文章
|
17天前
|
机器学习/深度学习 传感器 编解码
DINOv3上手指南:改变视觉模型使用方式,一个模型搞定分割、检测、深度估计
DINOv3是Meta推出的自监督视觉模型,支持冻结主干、仅训练轻量任务头即可在分割、深度估计等任务上达到SOTA,极大降低训练成本。其密集特征质量优异,适用于遥感、工业检测等多领域,真正实现“一个模型走天下”。
296 2
DINOv3上手指南:改变视觉模型使用方式,一个模型搞定分割、检测、深度估计
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
《解码AI大模型涌现能力:从量变到质变的智能跃迁》
人工智能大模型的涌现能力是当今科技的焦点。其产生依赖于四大关键因素:1) 海量数据提供丰富的训练素材,涵盖多样化的文本和图像;2) 强大算力如GPU、TPU加速模型训练,突破性能瓶颈;3) 精妙架构如Transformer引入自注意力机制,提升语义理解;4) 过参数化与优化策略使模型不断进化,展现未曾预设的能力。这些因素协同作用,推动大模型在复杂任务中表现出色,为未来带来更多可能。
353 11
|
小程序 JavaScript 开发工具
Uniapp 对接抖音短剧播放器 video-player 坑点解决
Uniapp 对接抖音短剧播放器 video-player 坑点解决
571 1
|
10月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
算法 Linux C语言
【Linux系统编程】深入理解Linux目录操作:文件夹位置指针操作函数(telldir,seekdir,rewinddir)
【Linux系统编程】深入理解Linux目录操作:文件夹位置指针操作函数(telldir,seekdir,rewinddir)
189 0
|
11月前
|
数据可视化 搜索推荐
重磅更新-UniApp自定义字体可视化设计
重磅更新-UniApp自定义字体可视化设计
290 0
|
JavaScript 安全 数据安全/隐私保护
去哪儿旅行JS逆向:__m__加密和请求头键值对加密(上篇)
去哪儿旅行JS逆向:__m__加密和请求头键值对加密(上篇)
272 0
去哪儿旅行JS逆向:__m__加密和请求头键值对加密(上篇)
|
SQL JSON 分布式计算
DataWorks操作报错合集之如何解决在创建Hologres开发节点时报错
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
【TS】关于v-for数组对象遍历以及在页面上使用提示object类型的问题解决
【TS】关于v-for数组对象遍历以及在页面上使用提示object类型的问题解决
293 0
|
JSON 数据格式 索引
Python之巅:探索50个代码大全
Python之巅:探索50个代码大全
447 0

热门文章

最新文章