[HTML] Media - Video Element
keywords: video, source, media, WebVTT, subtitle, cues, WebAPIs
HTML Element
一般來說,只需要在 <video> 上使用 src 來載入影片即可:
<video src="rabbit320.webm" controls>
<!-- here is fallback content -->
<p>
Your browser doesn't support HTML5 video. Here is a
<a href="rabbit320.webm">link to the video</a> instead.
</p>
</video>
然而為了要解決不同瀏覽器僅支援不同編解碼器(codec),可以在 <video> 中使用 <source> ,讓瀏覽器自動挑選它所支援的:
<video controls>
<source src="rabbit320.mp4" type="video/mp4" />
<source src="rabbit320.webm" type="video/webm" />
<p>
Your browser doesn't support HTML5 video. Here is a
<a href="rabbit320.mp4">link to the video</a> instead.
</p>
</video>
在每一個 <source> 標籤上都含有 type 屬性,雖然則不是必填的,但建議根據 MIME types 加以填寫,瀏覽器將會根據這個屬性值快速過濾適合的選項,否則瀏覽器需要花更多的時間和資源在嘗試影片的播放上。
其他還有些在 <video> 標籤上可以使用的屬性:
<video controls width="400" height="400" autoplay loop muted poster="poster.png">
<source src="rabbit320.mp4" type="video/mp4" />
<source src="rabbit320.webm" type="video/webm" />
<p>
Your browser doesn't support HTML5 video. Here is a
<a href="rabbit320.mp4">link to the video</a> instead.
</p>
</video>
autoplay:當頁面其他部分還在加載時就開始播放影音。為了避免對使用者造成困擾,一般會建議不要使用。poster:作為影片開始播放前的截圖。preload:用來緩衝處理大檔,三種值可供使用:none,auto,metadata。
HTML Media Element API
HTML Media Element @ MDN > Web technology for developers > Web APIs
屬性(Properties)
取得(getter)
HTMLMediaElement.currentSrc:取得當前 Media Element 的絕對路徑。HTMLMediaElement.duration:取得影片長度(秒),0則表示無法取得。HTMLMediaElement.paused:取得影片是否暫停播放。HTMLMediaElement.readyState:參考 state 的內容0表示尚未取得影片資訊1表示有足夠的媒體資訊,對影片使用 seek 不會導致錯誤2影片的當前時間可以播放,但還不足以播放下一個影格3影片的當前時間可以播放,並且已經載入後續更多影格4表示可完整播放影片,
取得或設定(getter and setter)
HTMLMediaElement.src:取得或設定影片的src。HTMLMediaElement.controls:取得或設定要不要顯示 video 播放器的控制列,Boolean。HTMLMediaElement.currentTime:取得或設定當前的影片所在的播放時間。HTMLMediaElement.muted:取得或設定影片是否靜音。HTMLMediaElement.volume:取得或設定影片的音量(0 ~ 1)。HTMLMediaElement.playbackRate:取得或設定 播放速率(0 < r <= 16)。
其他
HTMLMediaElement.ended:取得該影片是否已播放完畢。HTMLMediaElement.defaultMuted:取得 Video 元素上是否有muted屬性。HTMLMediaElement.error:取得MediaError物件,沒有錯誤則回傳null。
方法(Methods)
HTMLMediaElement.load():重置 media 元素到初始化的狀態,並且從選擇 media source 開始,重新載入以便可以從頭播放。HTMLMediaElement.pause()HTMLMediaElement.play()
事件(Event)
video = document.querySelector('video');
video.addEventListener('loadedmetadata', (e) => console.log('video on loadedmetadata'));
video.addEventListener('canplay', (e) => console.log('video on canplay'));
video.addEventListener('canplaythrough', (e) => {
console.log('video on canplaythrough');
video.controls = true;
});
加載影片事件
依照事件觸發順序排列:
- loadedmetadata:當媒體檔的 metadata 完成載入時,所有的屬性都包含最多可用的資訊。
- loadeddata:當第一個 frame 完成載入時促發。
- canplay:當資料足夠讓謀體可以播放時會促發此事件,至少已有一定數量的 frames。
- canplaythrough:當 readyState 變成
CAN_PLAY_THROUGH時會促發,表示整個媒體檔案都可以播放而不會中斷(假設下載的速度至少維持和當前相同)。另外,當在 paused 和 playing 之間切換時被觸發(實測結果並不一定)。
常用事件
pause:當影片暫停播放play:當影片開始播放ended:當影片播放完畢timeupdate:當currentTime變更時會觸發,因此影片播放時會連續觸發。需要 sync 時間軸的話可用。seeking:當設定currentTime時,會先觸發seeking事件。seeked:volumechange
其他事件
尚未清楚了解的事件
playingprogressratechange:播放速率改變時seekedseeking
Media Events @ MDN
影片字幕(WebVTT and Track Element)
keywords: WebVTT, track, cues
WebVTT Format
在 HTML5 的 video 中將可以使用 WebVTT 和 <track> 來在影片播放時添加文字。WebVTT 是一種字幕檔的格式,可以定義每段文字在影片的哪個時間點產生,並且可以套用有限的樣式和定位方式。這些文字都被稱作 cues,根據不同的用途可以分成:
- subtitles(字幕):通常是逐字稿的形式,讓不同語言的使用者都能了解影片的內容。
- captions(說明文字):在使用者無法聽到聲音 的情況下,提供說明或描述聲音。
- timed descriptions:將文字轉換成聲音,讓使用者在無法閱讀的情況下,可以用聽的。
聽打(transcribe)指的是將聽到的文字寫下來,而寫下來的內容稱作逐字稿(transcript)。
一個基本的 WebVTT 檔案會長這樣,副檔名是 .vtt:
WEBVTT
1
00:00:22.230 --> 00:00:24.606
This is the first subtitle.
2
00:00:30.739 --> 00:00:34.074
This is the second.