3

WebRTCを使ってファイル共有サイトを作ろうとしています。

私のテスト環境:

Chrome カナリア 42.0.2275.0 Mac 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);。ただし、これはファイル共有 Web アプリには遅すぎるため、WebRTC DataChannels を使用してこれを行いたいと考えています。

このSOの回答で提案されたことを試してみましたが、RTCデータチャネルを介して画像データを運がありませんでした。オプションを省略したRtpDataChannels: true場合、data.send() が 3KB/s (私のテストで確認済み) ではなく 64KB/s に抑制されることを示唆しています。これは RTP が抑制されるものです。

DataChannel を介して 3KB/s よりも高速に大きなファイルを送信する方法についてのアイデアはありますか?

4

1 に答える 1

1

あなたは(私が知る限り)500ミリ秒ごとに1つのチャンクを送信しています。それがあなたの主な制限があるところだと思います。

Firefox では、遅延なし (または最小限の遅延) ですべてのチャンクに対して .send() を呼び出すことができます。彼らは列に並び、できるだけ早く出かけます。これはメモリを消費することに注意してください。ただし、remainingDataURL にデータを保持するとメモリも消費します。

より洗練された方法では、バッファリングされたデータの量を監視できます。これにより、Chrome ですべてのデータを一度に送信できない場合に問題が回避される可能性があります (そうすべきです...)

于 2015-01-20T16:57:25.883 に答える