electron 设置新约束后麦克风未更改

thtygnil  于 2022-12-08  发布在  Electron
关注(0)|答案(1)|浏览(203)

我们正在电子中构建一个应用程序,在设置新的deviceId后,麦克风没有变化。没有显示错误。

//myId is an id retrieved from navigator.mediaDevices.enumerateDevices();
const constraints = {audio: {deviceId: {exact: myId}}};
navigator.mediaDevices.getUserMedia(constraints);

我们做错了什么?当我们在外部网站上测试它时,它看起来工作正常。
我们所有的搜索结果都没有任何有用的东西,或者是非常过时的搜索结果。电子是一个 chrome 浏览器。我们已经在这个问题上纠缠了一个多星期。它在Ubuntu和Windows 11上不起作用(目前为止我们只测试了这两个操作系统)。我们还没有为MacOs感到烦恼。

x6h2sr28

x6h2sr281#

1.请确保myId不为空,因为当您第一次调用navigator.mediaDevices.enumerateDevices()时,它可能返回空字符串。
1.对于我const constraints = {audio: {deviceId: {exact: myId}}};返回错误,因为exact。对于我工作const constraints = {audio: {deviceId: myId}};

  1. const constraints = {audio: {deviceId: {exact: myId}};结尾缺少一个'}'。
    1.如果您设置新设备,您必须从新流中获取新曲目并添加到旧流中。
    这是一个工作代码,它根据您单击按钮来改变麦克风
    script.js
let mediaStream;
let mic1Id, mic2Id;
navigator.mediaDevices.enumerateDevices().then((res) => {
    mic1Id = res[2].deviceId;
    mic2Id = res[3].deviceId;
    const constraints = {
        audio: {
            deviceId: { exact: mic1Id },
        },
    };
    navigator.mediaDevices.getUserMedia(constraints).then((stream) => {
        mediaStream = stream;

        var audio = document.querySelector("audio");
        stream.getAudioTracks()[0].enabled = true;

        audio.srcObject = stream;
    });
});

function getAudioTrack(deviceId) {
    const constraints = {
        audio: {
            deviceId: {
                exact: deviceId,
            },
        },
    };
    return navigator.mediaDevices.getUserMedia(constraints).then((stream) => {
        return stream.getAudioTracks();
    });
}

function replaceAudioTrack(stream, newAudioTrack) {
    let audioTrack = stream.getAudioTracks()[0];
    stream.removeTrack(audioTrack);
    stream.addTrack(newAudioTrack);
}

let btn1 = document.querySelector("button:nth-of-type(1)");
let btn2 = document.querySelector("button:nth-of-type(2)");

btn1.onclick = () => {
    getAudioTrack(mic1Id).then((res) => replaceAudioTrack(mediaStream, res[0]));
};
btn2.onclick = () => {
    getAudioTrack(mic2Id).then((res) => replaceAudioTrack(mediaStream, res[0]));
};

index.html

<audio autoplay></audio>
    <button>Mic 1</button>
    <button>Mic 2</button>

相关问题