WebCodecs API

注意:此功能在 專用 Web Workers 中可用。

WebCodecs API 為 Web 開發者提供了對影片流的單個幀以及音訊塊的底層訪問。它對於需要完全控制媒體處理方式的 Web 應用程式非常有用。例如,影片或音訊編輯器,以及視訊會議。

概念與用法

許多 Web API 在內部使用媒體編解碼器。例如,Web Audio APIWebRTC API。但是,這些 API 不允許開發者處理影片流的單個幀以及未混合的編碼音訊或影片塊。

Web 開發者通常使用 WebAssembly 來繞過此限制,並在瀏覽器中處理媒體編解碼器。但是,這需要額外的頻寬來下載瀏覽器中已存在的編解碼器,從而降低效能和功耗效率,並增加額外的開發開銷。

WebCodecs API 提供了對瀏覽器中已有的編解碼器的訪問。它允許訪問原始影片幀、音訊資料塊、影像解碼器、音訊和影片編碼器及解碼器。

處理模型

WebCodecs API 使用非同步 處理模型。每個編碼器或解碼器例項都維護一個內部的、獨立的處理佇列。在佇列化大量工作時,牢記此模型很重要。

名為 configure()encode()decode()flush() 的方法透過將控制訊息追加到佇列末尾來非同步操作,而名為 reset()close() 的方法則同步中止所有待處理的工作並清除處理佇列。在呼叫 reset() 後,可以在呼叫 configure() 後繼續佇列化更多工作,但 close() 是一個永久性操作。

名為 flush() 的方法可用於等待呼叫 flush() 時所有待處理的工作完成。但是,通常只應在佇列化完所有期望的工作後呼叫它。它無意於以固定的時間間隔強制進度。不必要地呼叫它會影響編碼器質量,並導致解碼器要求下一個輸入是關鍵幀。

解複用

目前沒有用於解複用媒體容器的 API。處理容器化媒體的開發者需要自己實現或使用第三方庫。例如,可以使用 MP4Box.jsjswebm 分別將音訊和影片資料解複用到 EncodedAudioChunkEncodedVideoChunk 物件。

介面

AudioDecoder

解碼 EncodedAudioChunk 物件。

VideoDecoder

解碼 EncodedVideoChunk 物件。

AudioEncoder

編碼 AudioData 物件。

VideoEncoder

編碼 VideoFrame 物件。

EncodedAudioChunk

表示特定於編解碼器的編碼音訊位元組。

EncodedVideoChunk

表示特定於編解碼器的編碼影片位元組。

AudioData

表示未編碼的音訊資料。

VideoFrame

表示未編碼影片資料的幀。

VideoColorSpace

表示影片幀的顏色空間。

ImageDecoder

解包和解碼影像資料,從而可以訪問動畫影像中的幀序列。

ImageTrackList

表示影像中可用軌道的列表。

ImageTrack

表示單個影像軌道。

示例

在以下示例中,幀從 MediaStreamTrackProcessor 返回,然後進行編碼。請參閱完整示例,並在文章 使用 WebCodecs 進行影片處理 中瞭解更多資訊。

js
let frame_counter = 0;
const track = stream.getVideoTracks()[0];
const media_processor = new MediaStreamTrackProcessor(track);
const reader = media_processor.readable.getReader();
while (true) {
  const result = await reader.read();
  if (result.done) break;
  let frame = result.value;
  if (encoder.encodeQueueSize > 2) {
    // Too many frames in flight, encoder is overwhelmed
    // let's drop this frame.
    frame.close();
  } else {
    frame_counter++;
    const insert_keyframe = frame_counter % 150 === 0;
    encoder.encode(frame, { keyFrame: insert_keyframe });
    frame.close();
  }
}

另見