我正在尝试学习 WebRTC,我已经实现了在同一页面中连接两个 RTCPeerConnection,现在我试图将它们分成两个单独的页面并连接它们。但是,在编写代码并交换报价和答案后,我注意到initiator.html 上的 addIceCandidate() 将始终使用 null 参数抛出此问题
Error at addIceCandidate from queue: TypeError: Failed to execute 'addIceCandidate' on 'RTCPeerConnection': Candidate missing values for both sdpMid and sdpMLineIndex
at processCandidateQueue (initiator.html:69)
经过一些阅读,我了解到 null 用于表示 ICE Candidate 收集完成,示例如下:https : //webrtc.github.io/samples/src/content/peerconnection/pc1/ 收集完成时也执行带有参数 null 的“addIceCandidate” . 但我不明白为什么我会看到我此时看到的错误。
我试过的:
结果:
发起者.html
<!doctype html>
<html lang="en">
<head>
<title>First WebRTC Project</title>
<link href="common.css" rel="stylesheet" />
</head>
<body>
<div class="log-display"></div>
<div class="func-list">
Initiating host
<div class="func">
<button onclick="onPrepareMedia(this)">Prepare …Run Code Online (Sandbox Code Playgroud) 我正在尝试基于 WebRTC 为 Android/iOS 应用程序实现 DTMF。Android 上有 DTMF API 吗?我尝试过拨打以下电话:
m_peerConnectionFactory.createdtmfsender(localAudioTrack);
m_peerConnectionFactory.insertDtmf(tone, duration,gap);
Run Code Online (Sandbox Code Playgroud)
我尝试过使用上面的 javascript api,它在浏览器上运行良好,但无法在 Android 上运行。我还没有在 iOS 上尝试过,因为我需要先让它在 Android 上运行。
请告诉我 Android/iOS 是否支持此功能?如果是的话,有人可以帮我提供正确的 api 吗
使用的 libjingle 版本:chrome 74.0.3729.169
webrtc peer-connection rtcpeerconnection webrtc-android webrtc-ios
我需要从 Web 应用程序获取客户端本地 IP 地址。
为此,我使用标准的 RTCPeerConnection 实现来获取。但是返回的ice候选并没有携带IP V4地址,而是一个看起来像guid的地址:asdf-xxxx-saass-xxxx.local
但令人惊讶的是,这个chrome 扩展程序能够在同一台机器和浏览器上获取相同的内容。
注意:我在 Web 应用程序中使用的代码与扩展的代码相同
这是相同的html代码:
<html>
<head>
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.1.js"></script>
<script type="text/javascript">
function logit(msg) {
var dt = new Date(); var time = dt.getHours() + ":" + dt.getMinutes() + ":"
+ dt.getSeconds();
console.log(time + " " + msg);
};
function getChromeVersion() {
try {
var raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);
return raw ? parseInt(raw[2], 10) : false;
} catch (e) {
return null;
}
}
function getChromeManifest() {
return chrome.runtime …Run Code Online (Sandbox Code Playgroud) 我试图检测 RTCPeerConnection 的另一端何时断开连接。目前我正在使用我的 RTCPeerConnection 对象执行以下操作:
rtcPeerConnection.oniceconnectionstatechange = () => {
const state = rtcPeerConnection.iceConnectionState;
if (state === "failed" || state === "closed") {
// connection to the peer is lost and unsalvageable, run cleanup code
} else if (state === "disconnected") {
// do nothing in the "disconnected" state as it appears to be a transient
// state that can easily return to "connected" - I've seen this with Firefox
}
};
Run Code Online (Sandbox Code Playgroud)
这似乎适用于我在非常简单的网络条件下进行的有限测试,但来自MDN的以下内容让我暂停,它可能不会在生产中保持不变:
当然,“断开”和“关闭”并不一定表示错误;这些可能是正常 ICE 协商的结果,所以一定要正确处理这些(如果有的话)。
RTCPeerConnection.onconnectionstatechange如果 …
我无法让我的 WebRTC 代码正常工作..我相信我做的一切都是正确的,但它仍然无法正常工作。有一些奇怪的为什么 ontrack 这么早就被调用了,也许它应该是这样的。
该网站使用 javascript 代码,服务器代码我没有发布,但这就是 WebSockets 连接的地方只是一个交换器,您发送到服务器的内容将相同的信息发送回您也连接的其他合作伙伴(陌生人)。
服务器代码看起来像这个小示例
private void writeStranger(UserProfile you, String msg) {
UserProfile stranger = you.stranger;
if(stranger != null)
sendMessage(stranger.getWebSocket(), msg);
}
public void sendMessage(WebSocket websocket, String msg) {
try {
websocket.send(msg);
} catch ( WebsocketNotConnectedException e ) {
disconnnectClient(websocket);
}
}
//...
case "ice_candidate":
JSONObject candidatePackage = (JSONObject) packet.get(1);
JSONObject candidate = (JSONObject) candidatePackage.get("candidate");
obj = new JSONObject();
list = new JSONArray();
list.put("iceCandidate");
obj.put("candidate", candidate);
list.put(obj);
System.out.println("Sent = " + list.toString());
writeStranger(you, list.toString()); …Run Code Online (Sandbox Code Playgroud) javascript html5-video webrtc getusermedia rtcpeerconnection