91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Angular中如何自定義視頻播放器

發布時間:2022-05-04 19:04:12 來源:億速云 閱讀:475 作者:iii 欄目:web開發

本篇內容主要講解“Angular中如何自定義視頻播放器”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Angular中如何自定義視頻播放器”吧!

Angular中如何自定義視頻播放器

實現的功能如下:

  • 播放 / 停止

  • 快退 / 快進 / 倍速

  • 聲音開 / 聲音關

  • 進入全屏 / 退出全屏

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

  • 經過時長 / 總時長

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

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

如圖:

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>

這里使用了 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
}

Angular中如何自定義視頻播放器

聲音開 / 聲音關

聲音的開關使用 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中如何自定義視頻播放器

到此,相信大家對“Angular中如何自定義視頻播放器”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

肥西县| 建德市| 额尔古纳市| 高要市| 富蕴县| 双流县| 安阳县| 巴彦淖尔市| 山阳县| 夏津县| 呼图壁县| 湘乡市| 东乌珠穆沁旗| 玛沁县| 丰宁| 托克托县| 横峰县| 屏东县| 泰兴市| 尉氏县| 乐山市| 民勤县| 兴安盟| 赤峰市| 瑞安市| 蛟河市| 嘉义县| 靖边县| 澄迈县| 武山县| 红原县| 邻水| 汶上县| 灌云县| 邢台市| 高碑店市| 康乐县| 宿迁市| 钦州市| 丰镇市| 永川市|