2015-01-14 1 views
3

WebRTC를 사용하여 파일 공유 사이트를 만들려고합니다. RTP 대신 SCTP를 통해 데이터를 보내는 데이터 채널 만들기

내 테스트 환경 :

크롬 카나리아 42.0.2275.0 맥 10.10 (14A389)

코드 :

var arrayToStoreChunks = []; 
channel.onmessage = function(data){ 
    // console.log(data.data); 
    var data = data.data; 

    arrayToStoreChunks.push(data.message); // pushing chunks in array 

    if (data.last) { 
    downloadURI(arrayToStoreChunks.join(''), 'some.jpg'); 
    arrayToStoreChunks = []; // resetting array 
    } 
}; 

var button = document.getElementById('button'); 
var fileElement = document.getElementById('files'); 
button.onclick = function(){ 
    var reader = new FileReader() 
    reader.readAsDataURL(fileElement.files[0]) 
    reader.onload = onReadAsDataURL; 
}; 

function downloadURI(uri, name) { 
    var link = document.createElement("a"); 
    link.download = name; 
    link.href = uri; 
    link.click(); 
} 

var chunkLength = 1000; 
function onReadAsDataURL(event, text) { 
    var data = {}; // data object to transmit over data channel 

    if (event) { 
    text = event.target.result; 
    } 

    if (text.length > chunkLength) { 
    data.message = text.slice(0, chunkLength); 
    } else { 
    data.message = text; 
    data.last = true; 
    } 

    channel.send(data); 

    var remainingDataURL = text.slice(data.message.length); 
    if (remainingDataURL.length) { 
    setTimeout(function() { 
     onReadAsDataURL(null, remainingDataURL); // continue transmitting 
    }, 500); 
    } 
} 

내가 데이터를 청크와 무엇이든 함께 메시지에 따라 어떤 크기로 보낸다 내가 지정한 지연. 이것은 var optionalRtpDataChannels = {optional: [{'RtpDataChannels': true}]};이 있고 해당 객체를 new RTCPeerConnection(servers, optionalRtpDataChannels);에 전달하면 작동합니다. 그러나 이것은 파일 공유 웹 응용 프로그램에 비해 너무 느리고 WebRTC DataChannels를 사용하여이 작업을 수행하고 싶습니다.

나는이 대답에 제안 된 시도했는데 Send image data over RTC Data Channel 행운이 없습니다. 그것은 RtpDataChannels: true 옵션을 생략하면 RTP가 조절되는 3KB/s (내 테스트에 의해 확인 됨)와는 반대로 data.send()가 64KB/s로 제한된다는 것을 의미합니다.

3KB/s보다 빠른 DataChannel에서 더 큰 파일을 전송하는 방법에 대한 아이디어가 있습니까?

+0

당신은 sharefest.me 및 peerjs 코드를 확인 않았다 ? 나의 이해는 그들이 이미 이것을하고 있으며, 그들의 코드는 공개적인 면허하에 제공되는 신맛이 없다는 것이다. –

+0

@AlexGouaillard sharefest가 현재 작동하지 않는 것 같습니다 – WillLA

+0

IT가 가능합니다. 오랫동안 코드를 보지 못했습니다. 그들은 데이터 채널의 개척자였으며, 특히 대역폭 벤치 마크와 관련이있었습니다. 다른 상위 프로젝트 (peer5.com –

답변

1

500ms마다 하나의 청크를 보내고 있습니다. 그것은 당신의 주요 한계가있는 곳입니다.

firefox에서는 아무런 지연이없는 모든 청크에 대해 .send()를 호출 할 수 있습니다. 대기열에 넣고 최대한 빨리 나가게됩니다. remainingDataURL의 데이터를 보유해도 메모리가 사용되지만 메모리가 필요합니다. 크롬은 한 번에 모든 데이터를 전송하지 않을 경우 문제가 발생하지 않도록 생각하고, 버퍼링 된 데이터의 양을 모니터링 할 수

애호가 방법 (그것이해야는 ...)

관련 문제