mirror of
https://github.com/HumanAIGC-Engineering/gradio-webrtc.git
synced 2026-02-04 17:39:23 +08:00
* 视觉更新 --------- Co-authored-by: 杍超 <huangbinchao.hbc@alibaba-inc.com> Co-authored-by: 款冬 <neil.xh@alibaba-inc.com>
66 lines
1.8 KiB
TypeScript
66 lines
1.8 KiB
TypeScript
export function get_devices(): Promise<MediaDeviceInfo[]> {
|
|
return navigator.mediaDevices.enumerateDevices();
|
|
}
|
|
|
|
export function handle_error(error: string): void {
|
|
throw new Error(error);
|
|
}
|
|
|
|
export function set_local_stream(
|
|
local_stream: MediaStream | null,
|
|
video_source: HTMLVideoElement
|
|
): void {
|
|
video_source.srcObject = local_stream;
|
|
video_source.muted = true;
|
|
video_source.play();
|
|
}
|
|
|
|
export async function get_video_stream(
|
|
include_audio: boolean | { deviceId: { exact: string } },
|
|
video_source: HTMLVideoElement,
|
|
device_id?: string,
|
|
track_constraints?:
|
|
| MediaTrackConstraints
|
|
| { video: MediaTrackConstraints; audio: MediaTrackConstraints }
|
|
): Promise<MediaStream> {
|
|
console.log(track_constraints);
|
|
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 || {
|
|
echoCancellation: true,
|
|
noiseSuppression: true,
|
|
autoGainControl: true,
|
|
};
|
|
const constraints = {
|
|
video: device_id
|
|
? { deviceId: { exact: device_id }, ...video_fallback_constraints }
|
|
: video_fallback_constraints,
|
|
audio:
|
|
typeof include_audio === "object"
|
|
? { ...include_audio, ...audio_fallback_constraints }
|
|
: include_audio,
|
|
};
|
|
|
|
return navigator.mediaDevices
|
|
.getUserMedia(constraints)
|
|
.then((local_stream: MediaStream) => {
|
|
set_local_stream(local_stream, video_source);
|
|
return local_stream;
|
|
});
|
|
}
|
|
|
|
export function set_available_devices(
|
|
devices: MediaDeviceInfo[],
|
|
kind: "videoinput" | "audioinput" = "videoinput"
|
|
): MediaDeviceInfo[] {
|
|
const cameras = devices.filter(
|
|
(device: MediaDeviceInfo) => device.kind === kind
|
|
);
|
|
|
|
return cameras;
|
|
}
|