Javascript WebRTC-更改音频输出设备

Javascript WebRTC-更改音频输出设备,javascript,webrtc,getusermedia,Javascript,Webrtc,Getusermedia,我有一个使用用户媒体设备的应用程序,我希望允许用户自行更改音频输出。为了做到这一点,我遵循了 当我选择所需的设备时,请尝试这样做: var deviceId = "b6d4b95564be24f8be5b8e982fdf851e658a05bb9d3aeec09280976b11debc2a"; var audioElement = document.querySelector('audio'); if (typeof audioElement.sinkId !== 'undefined') {

我有一个使用用户媒体设备的应用程序,我希望允许用户自行更改音频输出。为了做到这一点,我遵循了

当我选择所需的设备时,请尝试这样做:

var deviceId = "b6d4b95564be24f8be5b8e982fdf851e658a05bb9d3aeec09280976b11debc2a";
var audioElement = document.querySelector('audio');
if (typeof audioElement.sinkId !== 'undefined') {
    audioElement.setSinkId(deviceId)
        .then(function() {
            console.log('Success, audio output device attached: ' + deviceId);
        })
        .catch(function(error) {
            var errorMessage = error;
            if (error.name === 'SecurityError') {
                errorMessage = 'You need to use HTTPS for selecting audio output ' + 'device: ' + error;
            }
            console.error(errorMessage);
        });
} else {
    console.warn('Browser does not support output device selection.');
}
audioElement
是HTML文件中的音频标记。
deviceId
是我要用作输出的设备的id(例如:B6D4B95564BE24F8BE5B8E982DF851E658A05BB9D3AEEC09280976B11DEBC2A)

但是这给了我一个异常错误:找不到请求的设备

但是,
enumerateDevices
功能的
deviceId
结果:

navigator.mediaDevices.enumerateDevices().then(function(devices){
    var audioInputList = _.filter(devices, function(device){ return device.kind == "audioinput"; });
    var audioOutputList = _.filter(devices, function(device){ return device.kind == "audiooutput"; });
}).catch(function(){
    console.log("error");
});
那怎么了

编辑

这是我获取UserMedia和设备列表的方式:

function handleSuccess(stream){
    var audioElement = document.querySelector('audio');
    audioElement.srcObject = stream;
    return navigator.mediaDevices.enumerateDevices();
}

function gotDevices(devices){
    var audioDevice = { input:[], output:[] };
    audioDevice.input = _.filter(devices, function(device){ return device.kind == "audioinput"; });
    audioDevice.output = _.filter(devices, function(device){ return device.kind == "audiooutput"; });
}

function start(contraints){
    deconnectPeerConnection();
    navigator.mediaDevices.getUserMedia(contraints).then(handleSuccess)
    .then(gotDevices).catch(handleError);
}
start(constraints);

您是否在
.mediaDevices.getUserMedia()调用中执行
naviagtor.mediaDevices.enumerateDevices()
.setSinkId()
调用?要获得设置
sinkId
?@guest271314否的权限,我已经执行了
getUserMedia()
函数。之后,当用户在选择列表中选择设备时,我会这样做。在
audioElement.setSinkId(deviceId)
中定义了
deviceId
?为什么不在
中调用
.setSinkId()
。然后()
链接到
.enunerateDevices()
调用?@guest271314我发现了问题,上面的代码工作正常。。。谢谢你的建议;)@狂暴什么问题?我鼓励你把你的发现作为对这个问题的回答发布给后代。