How to make Media Session support Document Picture-in-Picture API ?

Paul Li
5 min readJun 19, 2024

--

How to make Media Session support Document Picture-in-Picture API ?

Introduction

Media Session API 賦予了 web developer 可以直接介入 browser / OS 提供的 media widget 得能力。當頁面中的 video / audio play 時,該 media widget 便會立馬被啟動。

以 Chrome 來說,它帶來了另一個 control panel 控制 video / audio 的便利,尤其在 multi-tab 的狀態下效果更是顯著,因為可以立即進行控制,不需要一個 tab 一個 tab 切換去找當前播放的 video / audio 在哪兒。

透過 Media Session API,我們可以提供更多資訊來豐富它的呈現,比方說 title、artist、album 以及 artwork(縮圖)。而面板亦提供了 play / pause、seek backward 以及 seek forward 等操作。讓 user 可以進行操作。如果 web developer 需要更細緻的操作也可以透過 setActionHandler 來進行事件攔截與監聽。

看看 Media Session 裡頭的 picture-in-picture 行為。一般來說只要 video property disablePictureInPicture 非 true 的狀態下,便可以在 control panel 上看到這個 picture-in-picture 按鈕。點擊後便可以立即將 video 切換到 picture-in-picture 模式。

Chrome > video in picture-in-picture mode

如上圖所示,picture-in-picture mode 讓 video 可以跨 tab 在最上層顯示,輕鬆達成多工模式,它亦提供了簡單的 video 操作,Picture-in-picture 雖然美好,但總是有些美中不足之處,因為只能針對 video 類型的 element 進行模式切換,也就是說如果有客製化的功能(control panel、彈幕或是 keyboard shortcut)便無法完整攤給 user。

也因此萌生想法,倘若可以攔截 Media Session > button picture-in-picture 點擊,並將它改成 Document Picture-in-Picture 模式,不就可以讓客製化的 video player element 完整功能進行呈現?這也是今天要來跟大家介紹的重點所在~

先準備好 custom video element

如範例所示,我們先準備好 custom video element,並且監聽裡頭 video > play event。

當 video play event fired,便可以透過 navigator.mediaSession.metadata 來進行基本的資訊設置。藉此豐富 media widget 的呈現。

Chrome > media widget

監聽 enterpictureinpicture 事件並進行行為改寫

透過 navigator.mediaSession.setActionHandler 來攔截 enterpictureinpicture 事件,倘若當前瀏覽器支援 Document Picture-in-Picture(row.24)則進行對應設置,反之,則 fallback 回原本 video.requestPictureInPicture(row.34) 的用法。(由於事件已經被我們攔截下來,所以要記得 fallback 回原本的 picture-in-picture 用法,不然會沒有作用)

當 user 點擊 picture-in-picture 按鈕後,便可以在 picture-in-picture 模式下使用完整的 video player 功能了。

Custom video player with Document Picture-in-Picture

Conclusion

透過以上兩步驟,便可以輕輕鬆鬆讓 media widget 也可以支援 Document Picture-in-Picture 功能,可以說是簡單非常,讓使用者體驗瞬間昇華至另一境地~大家也趕緊試試看吧!

希望本篇分享對大家都有所助益~ #MediaSession #picture-in-picture

Reference

--

--

Paul Li

Paul is the lead programmer of the AMP project at Yahoo Taiwan and is always eager for modern web technologies. He is also focusing on UX for vivid user flow.