fix track_constraints support

Fixed an issue where track_constraints does not take effect in the audio-video mode.
This commit is contained in:
bingochaos
2025-02-24 11:04:36 +08:00
committed by GitHub
parent 36190066ec
commit 28f9914c3e

View File

@@ -8,7 +8,7 @@ export function handle_error(error: string): void {
export function set_local_stream(
local_stream: MediaStream | null,
video_source: HTMLVideoElement,
video_source: HTMLVideoElement
): void {
video_source.srcObject = local_stream;
video_source.muted = true;
@@ -16,23 +16,31 @@ export function set_local_stream(
}
export async function get_video_stream(
include_audio: boolean,
include_audio: boolean | { deviceId: { exact: string } },
video_source: HTMLVideoElement,
device_id?: string,
track_constraints?: MediaTrackConstraints,
track_constraints?:
| MediaTrackConstraints
| { video: MediaTrackConstraints; audio: MediaTrackConstraints }
): Promise<MediaStream> {
const fallback_constraints = track_constraints || {
width: { ideal: 500 },
height: { ideal: 500 },
};
const video_fallback_constraints = (track_constraints as any)?.video ||
track_constraints || {
width: { ideal: 500 },
height: { ideal: 500 },
};
const audio_fallback_constraints = (track_constraints as any)?.audio ||
track_constraints;
const constraints = {
video: device_id
? { deviceId: { exact: device_id }, ...fallback_constraints }
: fallback_constraints,
audio: include_audio,
? { deviceId: { exact: device_id }, ...video_fallback_constraints }
: video_fallback_constraints,
audio: include_audio
? typeof include_audio === "object"
? { ...include_audio, ...audio_fallback_constraints }
: audio_fallback_constraints
: false,
};
return navigator.mediaDevices
.getUserMedia(constraints)
.then((local_stream: MediaStream) => {
@@ -43,10 +51,10 @@ export async function get_video_stream(
export function set_available_devices(
devices: MediaDeviceInfo[],
kind: "videoinput" | "audioinput" = "videoinput",
kind: "videoinput" | "audioinput" = "videoinput"
): MediaDeviceInfo[] {
const cameras = devices.filter(
(device: MediaDeviceInfo) => device.kind === kind,
(device: MediaDeviceInfo) => device.kind === kind
);
return cameras;