WebRTC media source switcher

Forcefully chose a specific webrtc input/output audio/video device

当前为 2020-04-02 提交的版本,查看 最新版本

// ==UserScript==
// @name         WebRTC media source switcher
// @namespace    https://daniil.it
// @version      0.1.3
// @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,
    }

    navigator.mediaDevices.getUserMedia = constraints => hidden.getUserMedia({audio: true, video: true}).then(() =>
        navigator.mediaDevices.enumerateDevices().then(devices => {
            devices.forEach(function(device) {
                if (device.kind == "videoinput" && constraints.video) {
                    if (constraints.video === true) constraints.video = {}
                    constraints.video.deviceId = {exact: device.deviceId}
                } else if (device.kind == "audioinput" && constraints.audio) {
                    if (constraints.audio === true) constraints.audio = {}
                    constraints.audio.deviceId = {exact: device.deviceId}
                }
            })
            console.log(constraints)
            return hidden.getUserMedia(constraints)
        })
    )
    navigator.mediaDevices.enumerateDevices = () => hidden.enumerateDevices().then(res => {
        alert("Called enumerateDevices");
        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;
    })
    /*
    for (let [key, value] of Object.entries(navigator.mediaDevices)) {
        navigator.mediaDevices[`__${key}`] = value;
        navigator.mediaDevices[key] = () => {
            alert(`Called ${key}`);
            return navigator.mediaDevices[`__${key}`](...arguments);
        }
    }*/
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址