【发布时间】:2021-04-10 13:22:42
【问题描述】:
我正在尝试使用 Twilio 可编程视频及其 Javascript SDK 实现网络聊天。 到目前为止,我已经成功创建了一个 Room(在后端)并将当前用户连接到该房间。
视频从本地网络摄像头(在 PC 上)流式传输到称为“remote-media-div”的 div。
当用户连接并在屏幕上看到视频时,Twilio 会在 remote-media-div 中插入一个标签和一个标签
如果有多个相机,我想让用户选择相机。我得到相机列表并将其显示在下拉列表中。当我选择网络摄像头时,我运行以下代码将流切换到新选择的摄像头。第二个网络摄像头的录制灯已打开,但仍从前一个摄像头接收视频。我做错了什么?
let currentStream = null;
$.ajax({
url: `/operations/Room/Create`,
type: 'POST',
contentType: "application/json",
success: function (result) {
var roomName = result.room.name;
var token = result.room.token;
Twilio.Video.connect(token,
{
name: `${roomName}`,
audio: true,
maxAudioBitrate: 16000,
video: { height: 1000, frameRate: 24, width: 1000 },
networkQuality: {local:1, remote: 1}
}
).then(function(room) {
currentStream= room.stream;
navigator.mediaDevices.enumerateDevices().then(gotDevices);
const localParticipant = room.localParticipant;
localParticipant.tracks.forEach(publication => {
const track = publication.track;
document.getElementById('remote-media-div').appendChild(track.attach());
});
}, function(error) {
console.error('Unable to connect to Room: ' + error.message);
});
},
error: function (error) {
console.log(error);
}
});
当下拉改变时,我切换媒体流。
function stopMediaTracks(stream) {
stream.getTracks().forEach(track => {
track.stop();
});
}
var cameraId = 1; // new Camera Id
const videoConstraints = {};
videoConstraints.deviceId = { exact:cameraId };
const constraints = {
video: videoConstraints,
audio: true
};
if (currentStream) {
stopMediaTracks(currentStream);
}
debugger;
const video = document.getElementsByTagName('video');
navigator.mediaDevices
.getUserMedia(constraints)
.then(stream => {
currentStream = stream;
video.srcObject = stream;
return navigator.mediaDevices.enumerateDevices();
})
.catch(error => {
console.error(error);
});
正如我所说,这段代码不会关闭前一个摄像头。并且视频(我自己的照片)一直来自以前的相机,尽管新相机也打开了。
我查看了 GitHub 上的示例代码,似乎没有做错。
【问题讨论】:
标签: twilio twilio-api twilio-video