- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经坚持了一段时间了。我的代码基于 https://webrtc.org/getting-started/firebase-rtc-codelab .我基本上只是将其更改为 React 和 firebase 实时数据库而不是 firestore。
const VideoRoom = () => {
const config = {
apiKey: xxx,
authDomain: xxx,
databaseURL: xxx,
projectId: xxx,
storageBucket: xxx,
messagingSenderId: xxx,
appId: xxx,
};
const rtcconfig = {
iceServers: [
{
urls: [
"stun:stun1.l.google.com:19302",
"stun:stun2.l.google.com:19302",
],
},
],
iceCandidatePoolSize: 10,
};
const { roomId } = useParams();
if (!firebase.apps.length) {
firebase.initializeApp(config);
}
const db = firebase.database();
const rooms = () => db.ref("rooms");
const room = (roomId) => db.ref(`rooms/${roomId}`);
const callerCandidates = (roomId) =>
db.ref(`rooms/${roomId}/callerCandidates`);
const calleeCandidates = (roomId) =>
db.ref(`rooms/${roomId}/calleeCandidates`);
const peerConnection = new RTCPeerConnection(rtcconfig);
var localStream = new MediaStream();
var remoteStream = null;
var localVideo = useRef(null);
var remoteVideo = useRef(null);
room(roomId)
.once("value")
.then((snapshot) => {
if (!snapshot.val()) {
createRoom();
return;
}
joinRoomById(roomId, snapshot.val());
});
useEffect(() => {
peerConnection.addEventListener("icegatheringstatechange", () => {
console.log(
`ICE gathering state changed: ${peerConnection.iceGatheringState}`
);
});
peerConnection.addEventListener("connectionstatechange", () => {
console.log(`Connection state change: ${peerConnection.connectionState}`);
});
peerConnection.addEventListener("signalingstatechange", () => {
console.log(`Signaling state change: ${peerConnection.signalingState}`);
});
peerConnection.addEventListener("iceconnectionstatechange ", () => {
console.log(
`ICE connection state change: ${peerConnection.iceConnectionState}`
);
});
});
const createRoom = async () => {
console.log("create room");
localStream.getTracks().forEach((track) => {
console.log("adding localStream to peerConnection");
peerConnection.addTrack(track, localStream);
});
peerConnection.addEventListener("icecandidate", (event) => {
console.log("listening for icecandidate on peerConnection");
if (!event.candidate) {
console.log("final icecandidate");
return;
}
console.log("callerCandidate written to database");
callerCandidates(roomId).set(event.candidate.toJSON());
});
const offer = await peerConnection.createOffer();
await peerConnection.setLocalDescription(offer);
console.log("Offer created and added to peerConnection local description");
const roomWithOffer = {
offer: {
type: offer.type,
sdp: offer.sdp,
},
};
await room(roomId).update(roomWithOffer);
console.log("Offer written to room database document");
peerConnection.addEventListener("track", (event) => {
event.streams[0].getTracks().forEach((track) => {
console.log(
"listening for track on peerConnection and adding them to remoteStream"
);
remoteStream.addTrack(track);
});
});
room(roomId).on("value", async (snapshot) => {
console.log("listening for remote session in room database document");
const data = snapshot.val();
if (!peerConnection.currentRemoteDescription && data && data.answer) {
console.log("Got remote description: ", data.answer);
const rtcSessionDescription = new RTCSessionDescription(data.answer);
await peerConnection.setRemoteDescription(rtcSessionDescription);
}
});
calleeCandidates(roomId).on("value", (snapshot) => {
console.log(
"listening for remote ICE candidates in room/calleCandidates database document"
);
if (snapshot.val()) {
snapshot.val().forEach(async (change) => {
if (change.type === "added") {
let data = change.doc.data();
await peerConnection.addIceCandidate(new RTCIceCandidate(data));
}
});
}
});
};
};
我通过 React 路由器获取 roomId,为了可读性,我省略了组件的其余部分。
控制台返回如下:
创建房间
信号状态变化:have-local-offer
优惠已创建并添加到 peerConnection 本地描述
ICE 收集状态更改:完成
在 peerConnection 上监听 icecandidate
最终冰候选人
将 localStream 添加到 peerConnection
报价写入房间数据库文件
在 room/calleCandidates 数据库文件中监听远程 ICE 候选人
在房间数据库文件中监听远程 session
在 about:webrtc firefox 选项卡中,我可以看到报价已成功创建,但没有任何 ice 候选人
提前致谢!
最佳答案
因此,事实证明,ICE 候选人收集仅在将某些轨道添加到流中时才开始,并且必须在创建报价之前完成。
因此,如果您在创建报价之前收集媒体并将其添加到 RTCPeerConnection 实例,那么您将看到正确收集 ICE 候选人。
编辑:除此之外,如果您在创建报价时提供如下选项,它将按预期开始 ICE 收集:
await this.connection.createOffer({
offerToReceiveAudio: true,
offerToReceiveVideo: true,
});
希望对您有所帮助!
关于reactjs - 没有 Ice Candidates 聚集,peerConnection.iceGatheringState 立即返回 "complete",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61325035/
我想沿着一个轴从特定位置的X数组中分散并收集元素。 因此,给定一个索引数组idx,我想选择第0列的idx(0) th元素,第1列的idx(1) th元素,等等。 在Numpy中,以下语句: X = n
我有一个在集群硬件中运行的 Java 应用程序。我使用 Hashmap 作为缓存。我也希望缓存能够集群。有没有一些开源java项目可以在两台连接的机器上同步Hashmap? 最佳答案 看看 Hazel
这个问题在这里已经有了答案: Count number of times that an item occurred in each of multiple columns (4 个答案) 关闭 5
我一直在尝试“组合”一个列表 I mean putting items together depending on the item inbetween, so ['d','-','g','p','q
非聚集文件存储在数据文件中,聚集索引按逻辑索引顺序存储数据。 逻辑顺序位于哪里? 最佳答案 大多数 MySQL 索引的结构为 BTree。 (参见维基百科) (我在此讨论中排除了 FULLTEXT 和
所有源和目标都位于不可缓存的内存中。毫无疑问。在启动 DMA(即分散-聚集 DMA)之前,我构建了 DMA 链表(包含 src、dest、size 和 next)。我想我不必将列表放入不可缓存的内存中
我需要将输入字符串拆分为输出字符串(按一定顺序)通过在输入字符串上应用一组正则表达式。我想实现这个功能与 akka Actor 集群一起使用,我将其分散正则表达式和输入字符串并收集字符串。不过我想知道
Windows 文件系统支持scatter/gather IO .(当然,其他平台也可以) 但是不知道什么时候用IO机制。 你能给我解释一个合适的案例吗? 使用I/O机制我们能得到什么好处?(只是一点
我正在尝试使用克隆调用两个端点并收集它们的信息以通过聚合发送,我必须将其与分散收集中介器一起使用。每个端点返回一个 json 字符串。但我一直遇到“期望 SOAP Envelope 的实现作为父级”错
我想要实现的目标是使用户空间中的内存块可以通过 PCIe 直接由 FPGA 板中的 DMA 内核访问(不受内核的任何干扰)。 为此,我在用户空间中使用 posix_memalign() 在用户空间中分
假设我有以下数据框: > a a Source: local data frame [3 x 2] my_type_1_num_widgets my_type_2_num_widgets 1
我已经搜索了一段时间,但似乎无法在文档或 SO 上找到任何有用的信息。 This question并没有真正帮助我,因为它引用了修改程序集,而我正在用 C 语言编写。 我有一些代码进行间接访问,我想对
我已经坚持了一段时间了。我的代码基于 https://webrtc.org/getting-started/firebase-rtc-codelab .我基本上只是将其更改为 React 和 fire
我可以合并 Mono> 的列表吗?数据源整合为单个Mono>包含所有项目而不阻塞? 在我的带有 Lombok 分散收集应用程序的 JDK 9 Spring Boot 2 中,此阻塞版本有效:
我是一名优秀的程序员,十分优秀!