您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Forcefully chose a specific webrtc input/output audio/video device
// ==UserScript== // @name WebRTC media source switcher // @namespace https://daniil.it // @version 0.1.4 // @description Forcefully chose a specific webrtc input/output audio/video device // @author Daniil Gentili <[email protected]> // @match https://*/* // @grant none // ==/UserScript== (function() { 'use strict'; var hidden = { enumerateDevices: navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices), getUserMedia: navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices), } navigator.mediaDevices.getUserMedia = constraints => navigator.mediaDevices.enumerateDevices().then(devices => { for (let x = 0; x < devices.length; x++) { if (devices[x].kind == "videoinput" && constraints.video) { if (constraints.video === true) constraints.video = {} constraints.video.deviceId = {exact: devices[x].deviceId} } else if (devices[x].kind == "audioinput" && constraints.audio) { if (constraints.audio === true) constraints.audio = {} constraints.audio.deviceId = {exact: devices[x].deviceId} } } return hidden.getUserMedia(constraints) }) navigator.mediaDevices.enumerateDevices = () => hidden.enumerateDevices().then(res => { if (window.newRes) { return window.newRes; } else { window.newRes = []; } var temp = {}; var tempLabels = {}; for (var i = 0; i < res.length; i++) { if (!temp[res[i].kind]) { temp[res[i].kind] = []; tempLabels[res[i].kind] = "Choose a "+res[i].kind+" device:\n"; } temp[res[i].kind].push(res[i]) tempLabels[res[i].kind] += temp[res[i].kind].length+": "+res[i].label+"\n" } for (let [key, value] of Object.entries(tempLabels)) { var choice = prompt(value); window.newRes.push(temp[key][choice-1]); } return window.newRes; }) })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址