Skip to content

媒体管理

WetRTC 的 MediaManager 提供设备枚举、本地媒体采集、屏幕分享和远端流管理能力。可通过 rtc.media 访问。

设备枚举

加载交互 Demo…
ts
import { MediaManager } from '@wetspace/wetrtc'

// 通过 WetRTC 实例(rtc.media)
// const devices = await rtc.media.enumerateDevices()

// 静态调用,无需创建实例
const devices = await MediaManager.enumerateDevices()
// [{ deviceId, groupId, kind: 'videoinput', label: '摄像头' }, ...]

const total = devices.length
const cameras = devices.filter(d => d.kind === 'videoinput').length
const mics = devices.filter(d => d.kind === 'audioinput').length
const speakers = devices.filter(d => d.kind === 'audiooutput').length

console.log(`共 ${total} 个设备:摄像头 ${cameras}、麦克风 ${mics}、扬声器 ${speakers}`)

采集本地媒体

加载交互 Demo…
ts
import { MediaManager } from '@wetspace/wetrtc'

// 摄像头 + 麦克风(静态调用,无需 WetRTC 实例)
const stream = await MediaManager.getUserMedia({
  video: { width: 1280, height: 720 },
  audio: true,
})
// 或在连接实例上:await rtc.media.getUserMedia({ ... })

// 绑定到 video 预览(含音频轨时可同时播放声音)
const video = document.querySelector('video')!
video.srcObject = stream
await video.play()

// 仅音频
const audioStream = await MediaManager.getUserMedia({ audio: true })

// 添加到 WebRTC 连接(rtc 为 WetRTC 实例)
// for (const track of stream.getTracks()) {
//   rtc.addTrack(track, stream)
// }

屏幕分享

ts
// 浏览器
const screenStream = await rtc.media.getDisplayMedia({
  video: { width: 1920, height: 1080, frameRate: 30 },
  audio: true,
})

// Electron(需传入 desktopCapturer sourceId)
const electronStream = await rtc.media.getDisplayMedia({
  sourceId: 'screen:0:0',
  audio: false,
})

// 添加屏幕流 track
for (const track of screenStream.getTracks()) {
  rtc.addTrack(track, screenStream)
}

低延迟场景可额外配置 videoEncodingpreferredVideoCodec: 'h264',详见 低延迟屏幕共享

加载交互 Demo…

屏幕录制

浏览器原生 MediaRecorder 可配合 getDisplayMedia 实现录屏。下方 Demo 演示完整流程:选择屏幕 → 录制 → 回放 / 下载。

加载交互 Demo…

远端媒体

远端媒体通过 track 事件自动管理:

ts
rtc.on('track', (ev) => {
  // ev.streams[0] 是远端 MediaStream
  remoteVideo.srcObject = ev.streams[0]
})

// 也可以手动获取
const remoteStreams = rtc.media.getRemoteStreams()

移除 Track

ts
// 停止并移除某个 track
rtc.removeTrack(track)

类型定义

ts
interface DeviceInfo {
  deviceId: string
  groupId: string
  kind: MediaDeviceKind
  label: string
}

interface DisplayMediaOptions {
  sourceId?: string       // Electron desktopCapturer sourceId
  audio?: boolean
  width?: number
  height?: number
  frameRate?: number
}

interface MediaConstraints {
  audio?: boolean | MediaTrackConstraints
  video?: boolean | MediaTrackConstraints
}

Released under the MIT License.