我想知道如何改变麦克风或网络摄像头。而 你是在一个视频聊天的人。
我现在已经尝试了几天,没有任何工作。本例但似乎要实现改变是更难的,而有人已经连接。
我的问题是: 如果我换了麦克风,声音就会消失 麦克风没有任何反应。我也不能把它改回默认值。
如果我改变网络摄像头,也会发生类似的事情。流挂起,最后一帧被看到。
我没有收到任何错误信息,事实上,它告诉我更改是成功的。
在通话建立之前,更改网络摄像头就可以了。
这里是相关的代码块。我读到的每一个地方都只是创建新的约束条件,并给有声视频流提供所需的deviceId。
function ChangeDevice() {
if (localStream) {
localStream.getTracks().forEach(track => {
track.stop();
});
}
var audioSource = audioInputSelect.value;
var videoSource = videoSelect.value;
console.log(videoSource);
console.log(audioSource);
const newConstraints = {
audio: {deviceId: audioSource ? {exact: audioSource} : undefined},
video: {deviceId: videoSource ? {exact: videoSource} : undefined}
};
navigator.mediaDevices.getUserMedia(newConstraints).then(gotStream).then(gotDevices).catch(handleError);
}
function gotStream(stream) {
console.log('Adding local stream.');
localStream = stream;
localVideo.srcObject = stream;
sendMessage(['got user media', room]);
if (isInitiator) {
maybeStart();
}
return navigator.mediaDevices.enumerateDevices(); // I added this
}
我想这两个是相关的函数 ChangeDevice是在我从下拉菜单中选择新设备时调用的 id的是正确的。
这是我使用的全部代码。
幸运的是 replaceTrack
现在似乎在所有的浏览器上都能工作,所以不需要重新协商。
我不得不编辑我的 gotStream
这样的功能。
function gotStream(stream) {
// If already started
// Need this if webcam or mic changes
if (isStarted) {
var videoTrack = stream.getVideoTracks()[0];
var audioTrack = stream.getAudioTracks()[0];
var sender = pc.getSenders().find(function(s) {
return s.track.kind == videoTrack.kind;
});
var sender2 = pc.getSenders().find(function(s) {
return s.track.kind == audioTrack.kind;
});
console.log('found sender:', sender);
sender.replaceTrack(videoTrack);
sender2.replaceTrack(audioTrack);
localStream = stream;
localVideo.srcObject = stream;
} else {
console.log('Adding local stream.');
localStream = stream;
localVideo.srcObject = stream;
sendMessage(['got user media', room]);
if (isInitiator) {
maybeStart();
}
}
return navigator.mediaDevices.enumerateDevices(); // I added this
}