2017-06-19 66 views
1

我目前正在从通过DataChannel发送到对等方的视频流接收块,然后该对等方将在另一端重建视频。将属性附加到通过DataChannel发送的ArrayBuffer

我有这部分工作得很好,但我想补充哪些块#它是收到的,所以它没关系,如果他们碰巧以不同于预期的顺序到达。

最初我以为增加一个参数chunkId会工作,但当我在接收端做.data.chunkId时,它是未定义的。

然后我试图字符串化的ArrayBuffer使用JSON.stringify({ "chunkId": chunkId, "data": chunk })chunkId连同但是当我分析它的另一端(Unexpected end of JSON inputUnexpected token , in JSON at position #

DataChannels也接受斑点,所以我想我会尝试,它会导致问题,但发件人正在使用node.js,这显然不能这样做。我不太能弄清楚如何解决这个问题。

我试过的最后一件事是简单地将chunkId附加到ArrayBuffer本身的开始/结尾处,但是当我尝试创建新阵列时,在尝试添加块本身时出现错误source is too large

实现此目的的正确方法是什么?

回答

2

你应该能够交融发送文本和ArrayBuffers,并检查他们接收:

var pc1 = new RTCPeerConnection(), pc2 = new RTCPeerConnection(); 
 

 
pc1.onicecandidate = e => pc2.addIceCandidate(e.candidate); 
 
pc2.onicecandidate = e => pc1.addIceCandidate(e.candidate); 
 
pc1.oniceconnectionstatechange = e => log(pc1.iceConnectionState); 
 
pc1.onnegotiationneeded = e => 
 
    pc1.createOffer().then(d => pc1.setLocalDescription(d)) 
 
    .then(() => pc2.setRemoteDescription(pc1.localDescription)) 
 
    .then(() => pc2.createAnswer()).then(d => pc2.setLocalDescription(d)) 
 
    .then(() => pc1.setRemoteDescription(pc2.localDescription)) 
 
    .catch(e => log(e)); 
 

 
var dc1 = pc1.createDataChannel("chat", {negotiated: true, id: 0}); 
 
var dc2 = pc2.createDataChannel("chat", {negotiated: true, id: 0}); 
 

 
dc2.binaryType = "arraybuffer"; 
 
dc2.onmessage = e => { 
 
    if (e.data instanceof ArrayBuffer) { 
 
    log("Got ArrayBuffer!"); 
 
    } else if (e.data instanceof Blob) { 
 
    log("Got Blob!"); 
 
    } else { 
 
    log("> " + e.data); 
 
    } 
 
} 
 

 
button.onclick = e => dc1.send(new ArrayBuffer(8)); 
 
chat.onkeypress = e => { 
 
    if (e.keyCode != 13) return; 
 
    dc1.send(chat.value); 
 
    chat.value = ""; 
 
}; 
 

 
var log = msg => div.innerHTML += "<br>" + msg;
Chat: <input id="chat"><button id="button">Send ArrayBuffer</button><br> 
 
<div id="div"></div> 
 
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>

那么,为什么不提前每个ArrayBuffer的发送大块ID?

+0

我想发送它分两部分将更容易出错,但我可以制定一些解决方法来解决/缓解它们。这是不幸的,它不能在同一时间完成 – Jabos