RTCRtpTransceiver:setCodecPreferences() 方法

Baseline 2024
新推出

自 ⁨2024 年 7 月⁩起,此功能可在最新的裝置和瀏覽器版本上使用。此功能可能無法在較舊的裝置或瀏覽器上使用。

RTCRtpTransceiver 介面的 setCodecPreferences() 方法用於設定收發器允許解碼*接收*資料的編解碼器,並按首選項遞減的順序排列。

使用此方法設定的首選項會影響與遠端對等方協商用於編碼其傳送的資料(包括用於重傳、冗餘和前向糾錯的編解碼器)的編解碼器。不在首選項列表中的編解碼器將不會包含在協商中。請注意,此收發器用於*傳送*內容的偏好設定取決於遠端對等方的偏好設定。

設定編解碼器偏好的推薦方法是,首先獲取實際支援解碼接收資料的編解碼器陣列,然後按首選項遞減的順序重新排序。這可以確保陣列按要求排序,不包含任何不支援的編解碼器,並且還包含重傳、冗餘和前向糾錯所需的編解碼器。

指定的編解碼器集將用於包含此收發器的所有未來連線,直到再次呼叫此方法為止。

在準備開啟 RTCPeerConnection 時,應在呼叫 RTCPeerConnection.createOffer()createAnswer() *之前*使用 setCodecPreferences() 設定編解碼器,因為這些方法會發起協商(並且預設情況下將使用*使用者代理*預設配置中的編解碼器引數)。

可以在正在進行的通訊中更改編解碼器,但需要先呼叫 setCodecPreferences(),然後啟動新的協商。WebRTC 應用程式已經在 negotiationneeded 事件處理程式 中包含了此程式碼。但請注意,在撰寫本文時,呼叫 setCodecPreferences() 時不會自動觸發該事件,因此您必須自己呼叫 onnegotiationneeded

有關 WebRTC 支援的編解碼器(以及每個編解碼器的優缺點)的指南,請參閱 WebRTC 使用的編解碼器

語法

js
setCodecPreferences(codecs)

引數

codecs

一個物件陣列,每個物件都提供收發器支援的 媒體編解碼器 的引數,並按首選項排序。如果 codecs 為空,則所有編解碼器配置將恢復到使用者代理的預設設定。

注意: codecs 中未包含的任何編解碼器在協商連線的過程中都不會被考慮。這可以防止使用您不希望使用的編解碼器。

陣列中的每個編解碼器物件都具有以下屬性

channels 可選

一個正整數,指示編解碼器支援的通道數。例如,對於音訊編解碼器,值為 1 表示單聲道,值為 2 表示立體聲。

clockRate

一個正整數,指定編解碼器的時鐘頻率(以赫茲 (Hz) 為單位)。時鐘頻率是編解碼器的 RTP 時間戳前進的速率。大多數編解碼器都有特定的允許值或允許值範圍。IANA 維護著一個編解碼器及其引數列表,包括其時鐘頻率。

mimeType

一個字串,指示編解碼器的 MIME 媒體型別和子型別,格式為 "type/subtype"。RTP 使用的 MIME 型別字串與別處使用的不同。IANA 維護著一個有效 MIME 型別登錄檔。另請參閱 WebRTC 使用的編解碼器,瞭解可能在此引用的潛在編解碼器的詳細資訊。

sdpFmtpLine 可選

一個字串,給出 a=fmtp 行中與編解碼器對應的格式特定引數欄位(來自 SDP),如果該欄位存在。如果不存在引數欄位,則省略此屬性。

返回值

無(undefined)。

異常

InvalidAccessError DOMException

codecs 列表包含一個或多個收發器關聯的 RTCRtpReceiver 不支援的編解碼器。

InvalidModificationError DOMException

codecs 列表僅包含 RTX、RED、FEC 或 Comfort Noise 的條目,或者是一個空集。編解碼器列表必須始終包含媒體編解碼器。

示例

建立首選編解碼器陣列

設定編解碼器偏好的推薦方法是,首先獲取實際支援解碼接收資料的編解碼器陣列,然後按首選項遞減的順序重新排列列表。

重要的是要從支援的編解碼器列表開始(而不是硬編碼您的首選編解碼器列表),因為如果您包含任何與關聯的 RTCRtpReceiver 不相容的編解碼器,當您呼叫 setCodecPreferences() 方法時,瀏覽器將丟擲 InvalidAccessError 異常。此外,陣列必須包含用於重傳、冗餘和前向糾錯的適當編解碼器,從支援的編解碼器列表開始可以確保這些編解碼器存在。

您可以使用 RTCRtpReceiver.getCapabilities() 靜態方法獲取支援解碼資料的編解碼器,如下所示:

js
const availReceiveCodecs = transceiver.receiver.getCapabilities("video").codecs;

要將編解碼器陣列重新排序為我們首選的順序,我們可以使用下面的排序函式,根據 MIME 型別進行排序(此函式來自 blog.mozilla.org (2024) 的 setCodecPreferences is now in all browsers!)。

js
function sortByMimeTypes(codecs, preferredOrder) {
  return codecs.sort((a, b) => {
    const indexA = preferredOrder.indexOf(a.mimeType);
    const indexB = preferredOrder.indexOf(b.mimeType);
    const orderA = indexA >= 0 ? indexA : Number.MAX_VALUE;
    const orderB = indexB >= 0 ? indexB : Number.MAX_VALUE;
    return orderA - orderB;
  });
}

該方法接受支援的編解碼器列表,以及一個包含首選 MIME 型別(按遞減順序)的陣列,並就地返回排序後的陣列。下面的程式碼展示瞭如何使用它,假設您已經設定了一個對等連線(peerConnection)。

js
// Get supported codecs the sort using preferred codecs
const supportedCodecs = RTCRtpReceiver.getCapabilities("video").codecs;
const preferredCodecs = ["video/H264", "video/VP8", "video/VP9"];
const sortedCodecs = sortByMimeTypes(supportedCodecs, preferredCodecs);

// Get transceiver for connection and set the preferences
const [transceiver] = peerConnection.getTransceivers();
transceiver.setCodecPreferences(sortedCodecs); // <---

規範

規範
WebRTC:瀏覽器中的即時通訊
# dom-rtcrtptransceiver-setcodecpreferences

瀏覽器相容性

另見