Chrome 75 版媒體更新

François Beaufort
François Beaufort

Chrome 的媒體功能已於 75 版更新。在本文中,我將討論這些新功能,包括:

  • 預測加密媒體的播放作業是否順暢且省電。
  • 支援影片元素的 playsInline 屬性提示。

加密媒體:解碼資訊

自 Chrome 66 起,網頁開發人員便可使用解碼資訊,根據編解碼器、設定檔、解析度、位元率等資訊,向瀏覽器查詢裝置的清晰內容解碼能力。這項資訊會根據瀏覽器記錄的先前播放統計資料,指出播放內容是否會順暢 (及時) 且節省電力。

Media Capabilities API 規格已定義解碼資訊,並且已更新為處理加密媒體設定,讓使用加密媒體 (EME) 的網站能夠選取最佳媒體串流。

簡單來說,以下說明為 EME 解碼資訊的處理方式。請試試官方範例

const encryptedMediaConfig = {
  type: 'media-source', // or 'file'
  video: {
    contentType: 'video/webm; codecs="vp09.00.10.08"',
    width: 1920,
    height: 1080,
    bitrate: 2646242, // number of bits used to encode a second of video
    framerate: '25' // number of frames used in one second
  },
  keySystemConfiguration: {
    keySystem: 'com.widevine.alpha',
    videoRobustness: 'SW_SECURE_DECODE' // Widevine L3
  }
};

navigator.mediaCapabilities.decodingInfo(encryptedMediaConfig).then(result => {
  if (!result.supported) {
    console.log('Argh! This encrypted media configuration is not supported.');
    return;
  }

  if (!result.keySystemAccess) {
    console.log('Argh! Encrypted media support is not available.')
    return;
  }

  console.log('This encrypted media configuration is supported.');
  console.log('Playback should be' +
      (result.smooth ? '' : ' NOT') + ' smooth and' +
      (result.powerEfficient ? '' : ' NOT') + ' power efficient.');

  // TODO: Use `result.keySystemAccess.createMediaKeys()` to setup EME playback.
});

EME 播放內容具有專屬的解碼和轉譯程式碼路徑,因此與清晰播放內容相比,支援不同的編解碼和效能。因此,必須在傳遞至 navigator.mediaCapabilities.decodingInfo() 的媒體設定物件中設定新的 keySystemConfiguration 金鑰。這個鍵的值是包含各種熱門 EME 類型的字典。這會複製提供給 EME 的 requestMediaKeySystemAccess() 輸入內容,但有一個重大差異:如果序列的意圖是讓 requestMediaKeySystemAccess() 選擇支援的子集,則會將提供給 requestMediaKeySystemAccess() 的輸入序列平坦化為單一值。

解碼資訊會說明單對音訊和影片串流的品質 (流暢度和電源效率),而不必對呼叫端做出決定。呼叫端仍應訂購媒體設定,就像與 requestMediaKeySystemAccess() 一樣。但現在他們會自行檢視清單。

navigator.mediaCapabilities.decodingInfo() 會傳回承諾,表示可使用包含三個布林值的物件以非同步方式解析:supportedsmoothpowerEfficient。不過,當您設定 keySystemConfiguration 鍵且 supportedtrue 時,系統也會傳回另一個名為 keySystemAccessMediaKeySystemAccess 物件。可用於要求部分媒體金鑰,並設定加密媒體播放功能。範例如下:

// Like rMSKA(), orderedMediaConfigs is ordered from most to least wanted.
const capabilitiesPromises = orderedMediaConfigs.map(mediaConfig =>
  navigator.mediaCapabilities.decodingInfo(mediaConfig)
);

// Assume this app wants a supported and smooth media playback.
let bestConfig = null;
for await (const result of capabilitiesPromises) {
  if (result.supported && result.smooth) {
    bestConfig = result;
    break;
  }
}

if (bestConfig) {
  const mediaKeys = await bestConfig.keySystemAccess.createMediaKeys();
  // TODO: rest of EME path as-is
} else {
  // Argh! No smooth configs found.
  // TODO: Maybe choose the lowest resolution and framerate available.
}

請注意,解碼加密媒體的資訊需要使用 HTTPS。

此外,請注意,這可能會以與 requestMediaKeySystemAccess() 相同的方式,在 Android 和 ChromeOS 上觸發使用者提示。不過,即使需要更多呼叫來設定加密媒體播放,也不會顯示比 requestMediaKeySystemAccess() 更多的提示。

ALT_TEXT_HERE
受保護內容提示

Intent to Experiment | Chromestatus Tracker | Chromium Bug

HTMLVideoElement.playsInline

Chrome 現已支援 playsInline 布林屬性。如果存在,則會向瀏覽器提示,影片應預設在文件中以「內嵌」方式顯示,並受限於元素的播放區域。

同樣地,與 Safari 一樣,iPhone 上的影片元素在播放開始時不會自動進入全螢幕模式,這項提示可讓部分內嵌者享有自動全螢幕影片播放體驗。網頁開發人員可視需要使用這項功能,選擇退出這項體驗。

<video playsinline></video>

由於 Android 和電腦版的 Chrome 並未實作自動全螢幕模式,因此不會使用 playsInline 影片元素屬性提示。

Intent to Ship | Chrome 狀態追蹤器 | Chromium 錯誤