本篇要解決的問題
上一篇我們使用了 Video.js 這個播放器,這一篇來用另一個播放器套件:Plyr。會選這套是因為 August 覺得他們的預設介面比 Video.js 還要好看,而且官方文件也沒有落落長到這一輩子都讀不完的架勢,除了支援 HTML5 的 Video、Audio,還支援 Youtube、Vimeo,如果要快速使用一個影音播放器,August 比較推薦 Plyr 而不是 Video.js。
本篇筆記的部份是實務上目前常用的:控制項、取值、事件、改樣式、外部平台影片。
Plyr 的官方件就寫在 GitHub 上:https://github.com/sampotts/plyr#readme
本篇最後完成的 Demo 在這:https://letswritetw.github.io/letswrite-plyr-player/
建立影片播放器及控制項
最基本的使用,範例程式碼如下:
<!-- 引用 CSS -->
<link rel="stylesheet" href="https://cdn.plyr.io/3.7.2/plyr.css" />
<!-- 放置影音 -->
<video id="player" playsinline controls data-poster="poster 圖檔路徑">
<source src="MP4 影片檔路徑" type="video/mp4" />
</video>
<!-- 引用 JS -->
<script src="https://cdn.plyr.io/3.7.2/plyr.js"></script>
<script>
const player = new Plyr('#player');
</script>
對,就是這麼樸實無華的簡單,立馬就看到一個美美的播放器產生,以下 poster 圖檔跟影片都用官網的 Demo:

當然,它還有很多東西可以使用。
開啟所有控制項
Plyr 播放器預設就跟上面截圖一樣,有些像是快轉幾秒、倒退幾秒的按鈕是不會出現的,可以用 controls 這個參數選擇要開啟哪些控制項,以下是複製文件上的程式碼:
const player = new Plyr('#player', {
controls: [
'play-large', // The large play button in the center
'restart', // Restart playback
'rewind', // Rewind by the seek time (default 10 seconds)
'play', // Play/pause playback
'fast-forward', // Fast forward by the seek time (default 10 seconds)
'progress', // The progress bar and scrubber for playback and buffering
'current-time', // The current time of playback
'duration', // The full duration of the media
'mute', // Toggle mute
'volume', // Volume control
'captions', // Toggle captions
'settings', // Settings menu
'pip', // Picture-in-picture (currently Safari only)
'airplay', // Airplay (currently Safari only)
'download', // Show a download button with a link to either the current source or a custom URL you specify in your options
'fullscreen', // Toggle fullscreen
]
});新增字幕檔
字幕檔的部份,HTML 如下:
<video id="player" playsinline controls data-poster="poster 圖檔路徑">
<source src="MP4 影片檔路徑" type="video/mp4" />
<!-- 加入字幕檔 -->
<track kind="captions" label="中文字幕"
src="dist/captions-zhTW.vtt" srclang="zh" default="default"/>
<track kind="captions" label="English captions"
src="dist/captions-en.vtt" srclang="en"/>
</video>
<track kind="captions"> 就是加入字幕檔的程式碼,如果加上 default 就是預設要顯示哪一個語系的字幕。
如果要判斷使用者目前的語系而顯示不同的字幕,就在 JS 上多加參數,如下:
const player = new Plyr('#player', {
captions: { active: true, language: 'auto' }
});新增多種畫質選擇
我們在看 Youtube 的時候,可以選擇要看的影片畫質,Plyr 也可以,方式就是針對不同的品質給不同的 source:
<video id="player" playsinline controls data-poster="poster 圖檔路徑"> <source src="MP4 影片檔 1080p 的路徑" size="1080" type="video/mp4" /> <source src="MP4 影片檔 720p 的路徑" size="720" type="video/mp4" /> <source src="MP4 影片檔 480p 的路徑" size="480" type="video/mp4" /> </video>
使用者就會多了影片畫質的選項可以選擇:

提示 Tooltip
所有的按鈕預設是不會顯示說明的,基本上使用的 Icon 也是大家常見,但為了能夠顯示下一段的中文化,範例的頁面一樣有把 Tooltip 給打開。
const player = new Plyr('#player', {
tooltips: { controls: true, seek: true }
});tooltips.controls 是指控制項上的按鈕。
tooltips.seek 是指時間軸。
中文化介面
Plyr 跟 Video.js 一樣也可以設定操作介面為中文,不過 August 找了一下,沒找到像 Video.js 一樣有提供的中文 JSON 檔,這邊就參照 Video.js 自行翻譯了一個版本:
const player = new Plyr('#player', {
i18n: {
restart: '重播', rewind: '倒帶 {seektime} 秒',
fastForward: '快轉 {seektime} 秒',
play: '播放', pause: '暫停',
seek: '尋找',
played: '已播放',
buffered: '緩衝',
currentTime: '目前時間', duration: '總共時間',
volume: '音量', mute: '靜音', unmute: '取消靜音',
captions: '內嵌字幕',
enableCaptions: '開啟內嵌字幕', disableCaptions: '關閉內嵌字幕',
enterFullscreen: '全螢幕', exitFullscreen: '退出全螢幕',
frameTitle: '{title} 播放器',
settings: '設定',
speed: '播放速率', normal: '一般',
quality: '畫質',
loop: '循還播放',
start: '開始', end: '結束',
all: '全部',
reset: '重置',
disabled: '關閉',
advertisement: '廣告',
}
});時間軸加上段落標記
我們看 Youtube 時,有些影片會看見作者有在時間軸上自行標記一個說明,Plyr 也有提供這功能:
const player = new Plyr('#player', {
markers: {
enabled: true,
points: [
{ time: 10, label: '段落標記 Demo1', },
{ time: 20, label: '段落標記 Demo2', },
{ time: 30, label: '段落標記之 <strong>可以用粗體字</strong>', },
]
}
});播放器上當使用者滑鼠移到標記的段落上就會看到像這樣:

取值:影片總時長、當下秒數
Plyr 可以取到影片上的數值,本篇一樣只示範取影片總時長、當下秒數。
const player = new Plyr('#player');
// 影片總時長(單位:秒)
const duration = player.duration; // => 39.76
// 當下秒數
let currentTime = player.currentTime; // => 7.902844官方文件 上有說明共有哪些值可以取,甚至還可以更改,就請各位朋友自行參閱囉~。
監聽事件:播放、暫停
Plry 有許多事件可以監聽,讓數據分析的人員可以收到資料來分析使用者的觀看情形。
本篇一樣僅示範播放、暫停這二個常見事件。
const player = new Plyr('#player');
// 播放事件
player.on('play', (event) => {
// 影片播放時要做的事
});
// 暫停事件
player.on('pause', (event) => {
// 影片暫停時要做的事
});官方文件 上有所有可監聽事件的說明,一樣請各位朋友自行取閱。
修改樣式
Plry 預設色就是他們的藍色,但跟 Video.js 不同,沒有再提供其他樣式的 CSS 檔,但有把 CSS 的各種變數寫成說明文件,要改樣式就是直接修改 CSS 變數。
例如主要顏色如果要修改成我們的品牌色,這邊以 Let’s Write 本身的品牌藍為例子,有以下二種方式可以修改:
<!-- 修改頁面上所有 Plyr 播放器的主要顏色 -->
<style>
:root {
--plyr-color-main: #42A6F7;
}
</style>
<!-- 只修改指定的 Plyr 播放器的主要顏色 -->
<style>
.theme-cutstom {
--plyr-color-main: #42A6F7;
}
</style>
<div class="theme-cutstom">
<video id="player" playsinline controls data-poster="poster 圖檔路徑">
<source src="MP4 影片檔路徑" type="video/mp4" />
</video>
</div>除了主要色系,官方文件 上列了超多變數,想完整客製樣式的朋友請自行觀看。
外部平台影片:Youtube、Vimeo
Plry 可以直接嵌入 Youtube、Vimeo 這二家平台的影片,是不是好棒棒~
Youtube
引用的方式很簡單,如下:
<div class="plyr__video-embed" id="player-youtube">
<iframe src="https://www.youtube.com/embed/YBePFPrlYgg"
allowfullscreen allowtransparency allow="autoplay"></iframe>
</div>
<script>
const playerYoutube = new Plyr('#player-youtube', {
noCookie: false, rel: 0, showinfo: 0, iv_load_policy: 3, modestbranding: 1
});
</script>後面的 options 不一定要有,也可以直接寫:
const playerYoutube = new Plyr('#player-youtube');options 的說明,文件上是說……
「請看 Youtube 的文件說明」XD~ 這邊就提供 Youtube 的說明連結啦:Supported parameters。
嵌入 Youtube 的影片後,操作介面會是 Plyr 的唷~ 不再是 Youtube 那個紅紅的樣式:

為什麼 Demo 頁上會選擇這則 Youtube 影片呢?因為真的超好笑,Auguts 每次看每次都笑到流淚,推薦給寫程式寫到煩悶的各位~
Youtube 可以監聽原有的 statechange 事件,回傳的值就跟 Youtube iframe API 的相同:
playerYoutube.on('statechange', event => {
console.log(event.detail.code); // => -1, 0, 1, 2, 3, 5
});回傳的六個數字,代表影片的不同狀態,說明如下:
- -1:unstarted 未啟動,初次載入
- 0:ended 結束
- 1:playing 播放中
- 2:paused 暫停
- 3:buffering 緩衝中
- 5:video cued 準備好可以播放了
Vimeo
要嵌入 Viemo 的影片,方式跟嵌 Youtube 的一樣簡單:
<div class="plyr__video-embed" id="player-vimeo">
<iframe src="https://player.vimeo.com/video/708244501"
allowfullscreen allowtransparency allow="autoplay"></iframe>
</div>
<script>
const playerVimeo = new Plyr('#player-vimeo', {
byline: false, portrait: false, title: false, speed: true, transparent: false
});
</script>options 一樣可寫可不寫,至於說明……一樣是看 Vimeo 的文件:Embed Options。
範例原始碼
本篇範例的原始碼有放上 GitHub,取用前麻煩點個星星或分享本篇文章,一個小小動作就是對本站大大的鼓勵。
Demo:https://letswritetw.github.io/letswrite-plyr-player/
原始碼:https://github.com/letswritetw/letswrite-plyr-player


