上一個章節我們介紹了CSS變數以及各種的狀態屬性,接下來我們要開始進入到如何整合到前端框架 Vue / Nuxt 裡面來使用,以及如何支援其他的媒體格式!還有多國語系的處理!

npm create vite@latest my-vue-app -- --template vue
然後 npm install media-chrome
npm install media-chrome --save
接下來在 Vite 專案中去做一些設定
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
export default defineConfig({
plugins: [
vue({
template: {
compilerOptions: {
// 告訴 Vue 以 media- 開頭的標籤是自訂組件
isCustomElement: (tag) => tag.startsWith('media-'),
},
},
}),
],
});
就可以直接在組件內引入 media-chrome 的元件
import 'media-chrome';
改寫你的元件 App.vue
// <script setup>
import { ref, onMounted } from 'vue';
import 'media-chrome';
const videoRef = ref(null);
const isPlaying = ref(false);
const currentTime = ref(0);
const duration = ref(0);
const formatTime = (seconds) => {
const mins = Math.floor(seconds / 60);
const secs = Math.floor(seconds % 60);
return `${mins}:${secs.toString().padStart(2, '0')}`;
};
onMounted(() => {
videoRef.value.addEventListener('play', () => {
isPlaying.value = true;
});
videoRef.value.addEventListener('pause', () => {
isPlaying.value = false;
});
videoRef.value.addEventListener('timeupdate', () => {
currentTime.value = videoRef.value.currentTime;
});
videoRef.value.addEventListener('loadedmetadata', () => {
duration.value = videoRef.value.duration;
});
});
<!-- <template> -->
<div class="video-player">
<media-controller>
<video
ref="videoRef"
slot="media"
src="https://stream.mux.com/A3VXy02VoUinw01pwyomEO3bHnG4P32xzV7u1j1FSzjNg/high.mp4"
crossorigin
playsinline
></video>
<media-control-bar>
<media-play-button></media-play-button>
<media-time-range></media-time-range>
<media-time-display showduration></media-time-display>
<media-mute-button></media-mute-button>
<media-volume-range></media-volume-range>
<media-fullscreen-button></media-fullscreen-button>
</media-control-bar>
</media-controller>
<div class="status">
<p>狀態: {{ isPlaying ? '播放中' : '已暫停' }}</p>
<p>時間: {{ formatTime(currentTime) }} / {{ formatTime(duration) }}</p>
</div>
</div>
/* <style scoped> */
.video-player {
max-width: 800px;
margin: 0 auto;
}
media-controller {
--media-primary-color: white;
--media-range-bar-color: #3b82f6;
width: 100%;
aspect-ratio: 16 / 9;
}
.status {
margin-top: 10px;
padding: 10px;
background: #f5f5f5;
border-radius: 4px;
}

nuxt.config.js
export default defineNuxtConfig({
vue: {
compilerOptions: {
isCustomElement: (tag) => tag.startsWith('media-')
}
}
})
plugins/media-chrome.client.js ( 只在 client 載入 )
export default defineNuxtPlugin(() => {
import('media-chrome');
})
這麼一來我們就可以在 Vue 跟 Nuxt 中使用 Media Chrome ~
Media Chrome 不只支援原生 <video>,還支援多種第三方播放器:
| 其他的媒體格式 | 用途 |
| <hls-video> | HLS 串流 |
| <dash-video> | DASH 串流 |
| <youtube-video> | YouTube 影片 |
| <vimeo-video> | Vimeo 影片 |
| <mux-video> | Mux 影片服務 |
| <cloudflare-video> | Cloudflare 影片 |
| <wistia-video> | Wistia 影片 |
| <videojs-video> | Video.js 播放器 |
先來安裝一下其他媒體組件,拿 HLS 串流為例子:
npm install hls-video-element
然後 imoprt 它
import 'hls-video-element'
這樣一來就可以直接使用 <hls-video /> 來做到直播串流的播放器
<media-controller
defaultstreamtype="live"
liveedgeoffset="10"
seektoliveoffset="7"
>
<hls-video
slot="media"
src="https://live-stream-url/stream.m3u8"
></hls-video>
<media-control-bar>
<media-play-button></media-play-button>
<media-live-button></media-live-button>
<media-time-range></media-time-range>
<media-mute-button></media-mute-button>
<media-fullscreen-button></media-fullscreen-button>
</media-control-bar>
</media-controller>
我們現在使用的時候滑鼠滑過去的提示都是英文的,但實際上 Media Chrome 有提供幾種的語言包可以讓我們去切換語言。

目前支援的語系有:
| 語系 | 對應語言 |
| en | English(英文) |
| es | Español(西班牙文) |
| fr | Français(法文) |
| pt | Português(葡萄牙文) |
| zh-CN | 简体中文 |
| zh-TW | 繁體中文 |
// 繁體中文
import 'media-chrome/dist/lang/zh-TW.js'
// 簡體中文
import 'media-chrome/dist/lang/zh-CN.js'
// 其他語言
import 'media-chrome/dist/lang/es.js' // 西班牙文
import 'media-chrome/dist/lang/fr.js' // 法文
import 'media-chrome/dist/lang/pt.js' // 葡萄牙文
然後設定播放器的語系
<!-- 使用繁體中文 -->
<media-controller lang="zh-TW">
<video slot="media" src="video.mp4"></video>
<media-control-bar>
<media-play-button></media-play-button>
<media-mute-button></media-mute-button>
<media-fullscreen-button></media-fullscreen-button>
</media-control-bar>
</media-controller>

這麼一來多國語系的部分就設定完成了!是不是非常簡單~
這次的案例我有放到 stackblitz 中,大家有興趣可以玩一玩!
stackblitz 範例 : https://stackblitz.com/edit/vitejs-vite-y7zh1nog?file=src%2FApp.vue
還沒有看過上一篇的請往這邊走:https://thecodingpro.com/b/B0VqiEzIdIH1RbwJ8Q6G
目前把 Media Chrome 大部分的功能都簡單的介紹一遍了,還有如何整合到框架裡面,接下來各位可以自己再去嘗試做一些客製化的操作,讓自己網站的播放器可以更符合使用者的體驗!
好啦~那我們就下一篇教學見啦~敬請期待!