日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

怎么自定義 Video 操作?自定義視頻播放器?下面本篇文章給大家介紹一下Angular 中自定義 Video 操作的方法,希望對大家有所幫助!


Angular中怎么自定義視頻播放器


上一篇文章是 Angular 項目實現權限控制。最近自己在網上看到別人使用 vue 進行自定義 video 的操作。加上不久前實現了 angular 自定義 video 的相關需求, 遂來記錄一下,作為交流思考。

實現的功能如下:

播放 / 停止

快退 / 快進 / 倍速

聲音開 / 聲音關

進入全屏 / 退出全屏

進入畫中畫 / 退出畫中畫 【安卓平板不支持,不建議使用】

經過時長 / 總時長

播放進度條功能:支持點擊,拖拽進度

聲音進度條功能:支持點擊,拖拽進度

如圖:


Angular中怎么自定義視頻播放器

下面我們來一一實現:

這里的重點不在布局,我們簡單來定義一下:

<!-- app.component.html -->
 
<div class="video-page">
  <div class="video-tools">
    <button nz-button nzType="primary" (click)="play('btn')" style="margin-right: 12px;">播放 ?</button>
    <button nz-button nzType="primary" (click)="pause('btn')">暫停 ?</button>
    <ng-container>
      <button nz-button nz-dropdown [nzDropdownMenu]="menuForward" nzPlacement="bottomCenter" style="margin: 0 12px;">快進 ?</button>
        <nz-dropdown-menu #menuForward="nzDropdownMenu">
          <ul nz-menu>
            <li nz-menu-item (click)="forwardSecond(10)">快進 10 s</li>
            <li nz-menu-item (click)="forwardSecond(20)">快進 20 s</li>
          </ul>
        </nz-dropdown-menu>
    </ng-container>
    <ng-container>
      <button nz-button nz-dropdown [nzDropdownMenu]="menuBack" nzPlacement="bottomCenter">快退 ?</button>
        <nz-dropdown-menu #menuBack="nzDropdownMenu">
          <ul nz-menu>
            <li nz-menu-item (click)="retreatSecond(10)">快退 10 s</li>
            <li nz-menu-item (click)="retreatSecond(20)">快退 20 s</li>
          </ul>
        </nz-dropdown-menu>
    </ng-container>
    <ng-container>
      <button nz-button nz-dropdown [nzDropdownMenu]="speedUp" nzPlacement="bottomCenter" style="margin: 0 12px;">倍速 ?</button>
        <nz-dropdown-menu #speedUp="nzDropdownMenu">
          <ul nz-menu>
            <li nz-menu-item (click)="speedUpVideo(1)">正常</li>
            <li nz-menu-item (click)="speedUpVideo(2)">2 倍</li>
            <li nz-menu-item (click)="speedUpVideo(4)">4 倍</li>
          </ul>
        </nz-dropdown-menu>
    </ng-container>
    <button nz-button nzType="primary" (click)="openOrCloseVoice()">聲音開 / 聲音關 ?</button>
    <button nz-button nzType="primary" style="margin: 0 12px;" (click)="toFullScreen()">全屏 ?</button>
    <br />
    <button nz-button nzType="primary" style="margin-top: 12px;" (click)="entryInPicture()">進入畫中畫 ?? 安卓平板不支持</button>
    <button nz-button nzType="primary" style="margin: 12px 12px 0 12px;" (click)="exitInPicture()">退出畫中畫 ?? 安卓平板不支持</button>
    <br />
    <div style="display: flex; justify-content: flex-start; align-items: center; margin: 12px 0;">
      經過時長 / 總時長 : ? {{ currentTime }}  / {{ totalTime }}
    </div>
    <!-- 進度條 -->
    <div style="display: flex; justify-content: flex-start; align-items: center; margin: 12px 0;">
      進度條:?
      <div
        class="custom-video_control-bg"
        (mousedown)="handleProgressDown($event)"
        (mousemove)="handleProgressMove($event)"
        (mouseup)="handleProgressUp($event)"
      >
        <div
          class="custom-video_control-bg-outside"
          id="custom-video_control-bg-outside"
        >
          <span
            class="custom-video_control-bg-inside"
            id="custom-video_control-bg-inside"
          ></span>
          <span
            class="custom-video_control-bg-inside-point"
            id="custom-video_control-bg-inside-point"
          ></span>
        </div>
      </div>
    </div>
    <div style="display: flex; justify-content: flex-start; align-items: center; margin: 12px 0;">
      聲音條:?
      <div class="custom-video_control-voice">
        <span class="custom-video_control-voice-play">
          <i nz-icon nzType="sound" nzTheme="outline"></i>
        </span>
        <div
          class="custom-video_control-voice-bg"
          id="custom-video_control-voice-bg"
          (mousedown)="handleVolProgressDown($event)"
          (mousemove)="handleVolProgressMove($event)"
          (mouseup)="handleVolProgressUp($event)"
        >
          <div
            class="custom-video_control-voice-bg-outside"
            id="custom-video_control-voice-bg-outside"
          >
            <span
              class="custom-video_control-voice-bg-inside"
              id="custom-video_control-voice-bg-inside"
            ></span>
            <span
              class="custom-video_control-voice-bg-point"
              id="custom-video_control-voice-bg-point"
            ></span>
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="video-content">
    <video id="video" class="video" style="width: 100%" poster="assets/poster.png">
      <source type="video/mp4" src="assets/demo.mp4">
      Sorry, your browser doesn't support.
    </video>
  </div>
</div>


播放 / 停止

這里直接調用 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
}

這里自定義的 play 和 pause 方法加上了一個標志,對下下面要講的進度條的控制有幫助,上面的代碼可以更加簡潔,讀者可以簡寫下。


快退 / 快進 / 倍速

這里的快退,快進和倍速設置了不同的選項,通過參數進行傳遞:

// 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
}


Angular中怎么自定義視頻播放器


聲音開 / 聲音關

聲音的開關使用 video 的 muted 屬性即可:

// 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中怎么自定義視頻播放器


效果演示

完成了上面的內容,我們以一個 gif 圖來展示效果:


全屏,聲音和畫中畫比較難截圖,Gif 上體現不來

詳細的代碼,請前往 video-ng 獲取。


分享到:
標簽:Angular 自定義視頻播放器
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定