我想检查一下我对 WebRTC 数据通道的理解是否正确,特别是通过改变字典的ordered
&maxRetransmits
或maxPacketLifeTime
属性可以实现的不同类型的通道RTCDataChannelInit
。我的以下假设是否正确:
Run Code Online (Sandbox Code Playgroud)RTCPeerConnection.createDataChannel("label", { ordered: true });
maxRetransmits
或被maxPacketLifeTime
指定以实现可靠性?)Run Code Online (Sandbox Code Playgroud)RTCPeerConnection.createDataChannel("label", { ordered: false });
Run Code Online (Sandbox Code Playgroud)RTCPeerConnection.createDataChannel("label", { ordered: false, maxRetransmits: 0 });
Run Code Online (Sandbox Code Playgroud)RTCPeerConnection.createDataChannel("label", { ordered: true, maxRetransmits: 0 });
这样做的目的是成为一个保持最新的社区Wiki帖子,因此对使用WebRTC DataChannel实现浏览器到浏览器(p2p)的JSON消息通信感兴趣的开发人员具有简单但功能性的示例.
WebRTC DataChannels是实验性的,仍处于草案阶段.目前网络似乎是过时的WebRTC示例的雷区,如果开发人员正在尝试学习RTCDataChannel API,那就更是如此.
现在,在WebRTC 兼容的浏览器中运行的简单但功能性的1页示例似乎很难找到.例如,一些示例省略了信号实现,其他示例仅适用于单个浏览器(例如Chrome-Chrome),许多因最近的API更改而过时,而其他示例如此复杂,它们为入门创建了障碍.
请发布符合以下条件的示例(如果不符合要求,请说明):
我想使用canvas元素作为webrtc通信的视频部分的mediastreamsource,任何方向都会有所帮助,搜索网络,找不到讨论这个主题的资源
*长篇背景故事*
问题是,我无法直接从相机发送视频,这是我在显示之前处理视频(一些图像处理内容,超出此问题的范围)的要求的一部分.
以前,在另一个对等的浏览器上<video>
,我没有使用标签直接显示视频,而是对隐藏的画布元素进行了一些处理,然后将细节复制到另一个画布(我使用了settimeout来保持绘图,这给了它illusion of live video
).
现在,客户希望在传输视频之前完成处理,因此我使用webrtc直接传递音频流(之前音频和视频都是通过webrtc发送的).对于视频流,我有两个解决方案:
脚步:
在本地对等体上处理视频,在隐藏的画布上绘制.简单的部分.
使用超时重复捕获图像数据并传输
a)使用websockets( yes, goes through server)
,这带来了可怕的延迟和浏览器的最终崩溃.
b)使用RTCDataChannel
,具有更好的性能,但有时无故失败.我还有其他几个问题(例如使用额外带宽,因为发送jpeg而不是webp).
另一个主要问题是,因为我正在使用超时:当我切换标签时,帧速率在另一侧下降.
那么,有什么方法可以将隐藏的画布用作mediastreamsource而不是我手动操作吗?
我启动了一个RTCDataChannel
,默认情况下它似乎处于不可靠的模式.
我想配置它是可靠的,以获得有保证的数据包传输,但RTCDataChannelInit
配置似乎没有这个设置.
dictionary RTCDataChannelInit {
boolean ordered = true;
unsigned short maxPacketLifeTime;
unsigned short maxRetransmits;
DOMString protocol = "";
boolean negotiated = false;
unsigned short id;
};
Run Code Online (Sandbox Code Playgroud)
此外,它RTCDataChannel.isReliable
是一个只读属性.
如何将通道配置为可靠模式?
我正在尝试使用 WebRTC 设置对等文件共享系统。我可以在每一侧打开一个数据通道,但我无法从一个用户向另一个用户发送消息。此外,如果一个对等方关闭通道,另一个对等方,则仅针对该用户触发 onclose 事件。
通过 webRTC 设置和使用数据通道的正确方法是什么?
你能告诉我我的代码有什么问题或缺失吗?
//create RTC peer objet.
var RTCPeerConnection = webkitRTCPeerConnection;
var RTCIceCandidate = window.RTCIceCandidate;
var RTCSessionDescription = window.RTCSessionDescription;
var iceServers = {
iceServers: [{
url: 'stun:stun.l.google.com:19302'
}]
};
var p2p_connection = new RTCPeerConnection({
iceServers: [
{ 'url': (IS_CHROME ? 'stun:stun.l.google.com:19302' : 'stun:23.21.150.121') }
]
});
// send offer (only executes in one browser)
function initiateConnection() {
p2p_connection.createOffer(function (description) {
p2p_connection.setLocalDescription(description);
server_socket.emit('p2p request', description,my_username);
});
};
// receive offer and send answer
server_socket.on('p2p request', …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在Android上实现WebRTC DataChannel.我想创建一个简单的peerconnection对象,它将打开DataChannel以使用WebRTC通过网络发送数据.我尝试创建PeerConnection对象时收到错误.我了解到我们使用工厂来创建peerconnection对象factory.createPeerConnection()
.
为此,我必须首先创建PeerConnectionFactory对象.在此之后,我可以使用它来创建PeerConnection对象.我得到错误Could not find method android.media.MediaCodec.setParameters
,Fatal Signal 11 (SIGSEGV) at 0x00000000 (code=1)
当我尝试创建PeerConnectionFactory对象时.我也试过以下代码PeerConnectionFactory.initializeAndroidGlobals(this, false, false, false);
这就是我想要做的:
PeerConnectionFactory factory = new PeerConnectionFactory();
peer = new Peer();
Run Code Online (Sandbox Code Playgroud)
这是我的Peer对象的样子:
public class Peer implements SdpObserver, PeerConnection.Observer, DataChannel.Observer {
private PeerConnection pc;
private DataChannel dc;
public Peer() {
this.pc = factory.createPeerConnection(RTCConfig.getIceServer(),
RTCConfig.getMediaConstraints(), this);
dc = this.pc.createDataChannel("sendDataChannel", new DataChannel.Init());
}
@Override
public void onAddStream(MediaStream arg0) {
// TODO Auto-generated method stub
}
@Override
public void onDataChannel(DataChannel dataChannel) { …
Run Code Online (Sandbox Code Playgroud) 我将ordered set设置为true,但是如果在短时间内(<1秒)发送了许多(1000或更多)消息,则收到的消息不会以相同的顺序接收.
rtcPeerConnection.createDataChannel("app", {
ordered: true,
maxPacketLifeTime: 3000
});
Run Code Online (Sandbox Code Playgroud)
如果需要,我可以提供一个最小的例子来重现这种奇怪的行为.
我还使用bufferedAmountLowThreshold和相关事件来延迟发送缓冲量太大.我选择2000但我不知道最佳数字是多少.我在短时间内收到如此多邮件的原因是因为我不想溢出一次发送的最大数据量.所以我将数据分成800字节包并发送.我再次不知道1条消息的最大大小是多少.
const SEND_BUFFERED_AMOUNT_LOW_THRESHOLD = 2000; //Bytes
rtcSendDataChannel.bufferedAmountLowThreshold = SEND_BUFFERED_AMOUNT_LOW_THRESHOLD;
const MAX_MESSAGE_SIZE = 800;
Run Code Online (Sandbox Code Playgroud)
对于未分成太多消息的小数据,一切正常.仅对大文件随机发生错误.
我想将流数据(作为 的序列ArrayBuffer
)从 Chrome 扩展程序发送到 Chrome 应用程序,因为Chrome 消息 API(包括chrome.runtime.sendMessage
, postMessage
...)不支持ArrayBuffer
并且 JS 数组性能较差,我必须尝试其他方法。最终,我发现 WebRTCRTCDataChannel
对于我来说可能是一个很好的解决方案。
我已成功通过 a 发送字符串RTCDataChannel
,但是当我尝试发送时,ArrayBuffer
我得到:
code: 19
message: "Failed to execute 'send' on 'RTCDataChannel': Could not send data"
name: "NetworkError"
Run Code Online (Sandbox Code Playgroud)
看来这不是带宽限制问题,因为即使我发送了一个字节的数据,它也失败了。这是我的代码:
code: 19
message: "Failed to execute 'send' on 'RTCDataChannel': Could not send data"
name: "NetworkError"
Run Code Online (Sandbox Code Playgroud)
在 OSX 10.10.1、Chrome M40 (Stnble)、M42(Canary) 上测试;以及 Chromebook M40 上。
我在这里提交了一个 WebRTC 错误。
google-chrome google-chrome-extension webrtc google-chrome-app rtcdatachannel
WebRTC RTCPeerConnection
接口有一个createDataChannel
方法和一个ondatachannel
事件处理程序.这些如何互动?如何创建可用于在两个对等体之间发送/接收数据的单个数据通道?
此外,RTCDataChannelInit
构造函数有一个negotiated
字段,默认情况下设置为false
并表示它会导致频道在带内通知.如果设置为什么会发生什么true
?
我对RTCDataChannel有一个奇怪的问题.
我正在研究WebRTC,我已经开始进行WebRTC音频/视频聊天了.现在我想使用RTCDataChannel为其添加文本聊天和文件共享.
我已经像这样创建了RTCDataChannel:
var dataChannelOptions = {
reliable: true,
maxRetransmitTime: "2000"
};
dataChannel = yourConnection.createDataChannel("testDataChannel", dataChannelOptions);
dataChannel.onerror = function (error) {
console.log("dataChannel.OnError:", error);
};
dataChannel.onmessage = function (event) {
console.log("dataChannel.OnMessage:", event);
};
dataChannel.onopen = function (event) {
console.log("dataChannel.OnOpen", event);
dataChannel.send("Hello World!");
};
dataChannel.onclose = function (event) {
console.log("dataChannel.OnClose", event);
};
Run Code Online (Sandbox Code Playgroud)
我唯一接受的是从dataChannel.onopen的第一行登录.我没有从dataChannel.onmessage收到日志.
没有错误..
当我手动调用dataChannel.send时结果是一样的.
测试:
谷歌Chrome(50.0.2661.94)
Firefox(45.0.2)
任何人都可以帮忙吗?
rtcdatachannel ×10
webrtc ×10
javascript ×4
android ×1
arraybuffer ×1
html5 ×1
p2p ×1
real-time ×1
sctp ×1