Skip to content

编解码器偏好

WetRTC 支持在 SDP 协商前通过 RTCRtpTransceiver.setCodecPreferences() 调整视频与音频编解码器优先级。

导入

ts
import {
  type PreferredVideoCodec,
  type PreferredAudioCodec,
  type VideoRtpCodec,
  type AudioRtpCodec,
  sortVideoCodecsH264First,
  applyH264CodecPreference,
  applyH264CodecPreferences,
  sortAudioCodecsOpusFirst,
  applyOpusCodecPreference,
  applyOpusCodecPreferences,
} from '@wetspace/wetrtc'

通过 WetRTC 配置(推荐)

ts
const rtc = new WetRTC({
  signal,
  direction: 'sendrecv',
  preferredVideoCodec: 'h264',
  preferredAudioCodec: 'opus',
})

视频:preferredVideoCodec

说明
'auto'默认,使用浏览器协商顺序
'h264'将 H.264 排在 VP8 / VP9 等编解码器之前

适用于屏幕共享等希望启用硬件视频编码的场景(Electron / Chrome 在 Windows 等平台通常对 H.264 走硬件编码)。

音频:preferredAudioCodec

说明
'auto'默认,使用浏览器协商顺序
'opus'将 Opus 排在 PCMU / PCMA 等编解码器之前

WebRTC 语音默认即为 Opus;显式设置可确保在多种音频 codec 并存时优先 Opus。

WetRTC 会在以下时机自动应用:

  1. addTrack() — 添加 track 后,对对应 transceiver 设置编解码器偏好
  2. ensureTransceivers()recvonly 方向创建 transceiver 后立即设置
  3. connect() — 发起协商前对所有已存在的 transceiver 再次兜底

兼容性

若对端不支持首选编解码器,WebRTC 会自动回退。视频可通过 监控诊断 中的 stats.codec 确认实际协商结果。

视频:H.264 排序策略

sortVideoCodecsH264First()RTCRtpReceiver.getCapabilities('video') 返回的编解码器列表重新排序:

  1. 所有 mimeTypevideo/h264(不区分大小写)的条目排在前面
  2. H.264 内部优先 sdpFmtpLinepacketization-mode=1 的配置
  3. 其余编解码器(VP8、VP9、AV1 等)保持相对顺序接在后面

音频:Opus 排序策略

sortAudioCodecsOpusFirst()RTCRtpReceiver.getCapabilities('audio') 返回的编解码器列表重新排序:

  1. 所有 mimeTypeaudio/opus 的条目排在前面
  2. 其余编解码器(PCMU、PCMA、G722 等)保持相对顺序接在后面

独立工具函数

视频

函数说明
sortVideoCodecsH264First(codecs)返回 H.264 优先的编解码器列表
applyH264CodecPreference(transceiver)对单个 transceiver 应用 H.264 优先
applyH264CodecPreferences(pc)批量应用至所有视频 transceiver

音频

函数说明
sortAudioCodecsOpusFirst(codecs)返回 Opus 优先的编解码器列表
applyOpusCodecPreference(transceiver)对单个 transceiver 应用 Opus 优先
applyOpusCodecPreferences(pc)批量应用至所有音频 transceiver

调用时机

setCodecPreferences 必须在 createOffer() / createAnswer() 之前调用。WetRTC 已在内部保证这一点;若手动集成,请勿在协商完成后再修改偏好。

Released under the MIT License.