千家信息网

Angular中如何自定义视频播放器

发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,本篇内容主要讲解"Angular中如何自定义视频播放器",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Angular中如何自定义视频播放器"吧!实现的功能如
千家信息网最后更新 2025年01月18日Angular中如何自定义视频播放器

本篇内容主要讲解"Angular中如何自定义视频播放器",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Angular中如何自定义视频播放器"吧!

实现的功能如下:

  • 播放 / 停止

  • 快退 / 快进 / 倍速

  • 声音开 / 声音关

  • 进入全屏 / 退出全屏

  • 进入画中画 / 退出画中画 【安卓平板不支持,不建议使用】

  • 经过时长 / 总时长

  • 播放进度条功能:支持点击,拖拽进度

  • 声音进度条功能:支持点击,拖拽进度

如图:

下面我们来一一实现:

这里的重点不在布局,我们简单来定义一下:

  • 快进 10 s
  • 快进 20 s
  • 快退 10 s
  • 快退 20 s
  • 正常
  • 2 倍
  • 4 倍


经过时长 / 总时长 : ✅ {{ currentTime }} / {{ totalTime }}
进度条:✅
声音条:✅

这里使用了 angular ant design,之前写了一篇相关文章,还不熟悉的读者可前往 Angular 结合 NG-ZORRO 快速开发

播放 / 停止

这里直接调用 video 对象的方法 play()pause():

// app.component.ts// 播放按钮事件play(flag: string | undefined) {  if(flag) this.videoState.playState = true  this.videoState.play = true  this.video.play()}// 暂停按钮事件pause(flag: string | undefined): void {  if(flag) this.videoState.playState = false  this.video.pause()  this.videoState.play = false}

这里自定义的 playpause 方法加上了一个标志,对下下面要讲的进度条的控制有帮助,上面的代码可以更加简洁,读者可以简写下。

快退 / 快进 / 倍速

这里的快退,快进和倍速设置了不同的选项,通过参数进行传递:

// app.component.ts// 快进指定的时间forwardSecond(second: number): void {  this.video.currentTime += second; // 定位到当前的播放时间 currentTime}// 后退指定的时间retreatSecond(second: number): void {  this.video.currentTime -= second}// 倍速speedUpVideo(multiple: number): void {  this.video.playbackRate = multiple; // 设定当前的倍速 playbackRate}

声音开 / 声音关

声音的开关使用 videomuted 属性即可:

// app.component.ts// 开或关声音openOrCloseVoice(): void {  this.video.muted = !this.video.muted;}

进入全屏 / 退出全屏

全屏的操作也是很简单,使用 webkitRequestFullScreen

// app.component.ts// 全屏操作toFullScreen(): void {  this.video.webkitRequestFullScreen()}

全屏后,按 esc 可退出全屏

进入画中画 / 退出画中画

画中画相当于弹窗缩小视频~

// app.component.ts// 进入画中画entryInPicture(): void {  this.video.requestPictureInPicture()  this.video.style.display = "none"}// 退出画中画exitInPicture(): void {  if(this.document.pictureInPictureElement) {    this.document.exitPictureInPicture()    this.video.style.display = "block"  }}

设置 video 的样式,是为了看起来不突兀...

经过时长 / 总时长

记录视频的总时长和视频当前的播放时长。我们已经来组件的时候就获取视频的元信息,得到总时长;在视频播放的过程中,更新当前时长。

// app.component.ts// 初始化 video 的相关的事件initVideoData(): void {  // 获取视频的总时长  this.video.addEventListener('loadedmetadata', () => {    this.totalTime = this.formatTime(this.video.duration)  })  // 监听时间发生更改  this.video.addEventListener('timeupdate', () => {    this.currentTime = this.formatTime(this.video.currentTime) // 当前播放的时间  })}

formatTime 是格式化函数

播放进度条功能

监听鼠标的点击,移动,松开的事件,对视频的播放时间和总事件进行相除,计算百分比。

// app.component.ts// 进度条鼠标按下handleProgressDown(event: any): void {  this.videoState.downState = true  this.pause(undefined);  this.videoState.distance = event.clientX + document.documentElement.scrollLeft - this.videoState.leftInit;}// 进度条 滚动条移动handleProgressMove(event: any): void {  if(!this.videoState.downState) return  let distanceX = (event.clientX + document.documentElement.scrollLeft) - this.videoState.leftInit  if(distanceX > this.processWidth) { // 容错处理    distanceX = this.processWidth;  }  if(distanceX < 0) { // 容错处理    distanceX = 0  }  this.videoState.distance = distanceX  this.video.currentTime = this.videoState.distance / this.processWidth * this.video.duration}// 进度条 鼠标抬起handleProgressUp(event: any): void {  this.videoState.downState = false  // 视频播放  this.video.currentTime = this.videoState.distance / this.processWidth * this.video.duration  this.currentTime = this.formatTime(this.video.currentTime)  if(this.videoState.playState) {    this.play(undefined)  }}

这里需要计算进度条的位置,来获取点击进度条的百分比,之后更新视频的当前播放时间。当然,我们还得有容错处理,比如进度条为负数时候,当前播放时间为0。

声音进度条

我们实现了播放进度条的操作,对声音进度条的实现就很容易上手了。声音进度条也是监听鼠标的点击,移动,松开。不过,这次我们处理的是已知声音 div 的高度。

// app.component.ts// 声音条 鼠标按下handleVolProgressDown(event: any) {  this.voiceState.topInit = this.getOffset(this.voiceProOut, undefined).top  this.volProcessHeight = this.voiceProOut.clientHeight  this.voiceState.downState = true //按下鼠标标志  this.voiceState.distance = this.volProcessHeight - (event.clientY + document.documentElement.scrollTop - this.voiceState.topInit) }// 声音 滚动条移动handleVolProgressMove(event: any) {  if(!this.voiceState.downState) return    let disY = this.voiceState.topInit + this.volProcessHeight - (event.clientY + document.documentElement.scrollTop)    if(disY > this.volProcessHeight - 2) { // 容错处理      disY = this.volProcessHeight - 2    }    if(disY < 0) { // 容错处理      disY = 0    }    this.voiceState.distance = disY    this.video.volume = this.voiceState.distance / this.volProcessHeight    this.videoOption.volume = Math.round(this.video.volume * 100)}// 声音 鼠标抬起handleVolProgressUp(event: any) {  this.voiceState.downState = false //按下鼠标标志  let voiceRate =  this.voiceState.distance / this.volProcessHeight  if(voiceRate > 1) {    voiceRate = 1  }  if(voiceRate < 0) {    voiceRate = 0  }  this.video.volume = voiceRate  this.videoOption.volume = Math.round(this.video.volume * 100); // 赋值给视频声音}

如图:

到此,相信大家对"Angular中如何自定义视频播放器"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

声音 进度 视频 时长 画中画 时间 鼠标 事件 处理 支持 功能 移动 播放器 平板 方法 安卓 容错 监听 内容 按钮 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 伊宁塔式服务器维保公司 搭建电话服务器 杭州西派网络技术有限公司 兴业银行软件开发 社招 腾根网络技术有限公司 天骐行尸走肉服务器小游戏21 黑客联盟网络安全吗 陶家润泽谷数据库 税务局网络安全自查报告 如何测试虚拟机连接数据库 济南网络安全学院招生简章 长沙金盾网络安全公司 汽车车载网络技术发展论文 重大网络安全风险几级以上 数据库实体写法 中亚犬是哪里的系统软件开发 无法连接云端服务器有啥影响 贵州管理平台软件开发 奥维 企业服务器 谷歌地图 宁夏智慧景区软件开发 黔西南软件开发贵不贵哪个好 怎样给数据库更改标题 坚决打好网络安全 过家家互联网科技公司 银行软件开发项目经理的任命 小学生网络安全分析 河南快道网络技术有限公司 moxa串口服务器配置 深圳市运趣互联网科技有限公司 不同服务器 哈利波特
0