Подтвердить что ты не робот

Зачем нужен сервер сигнализации для WebRTC?

WebRTC - это протокол, который определяет метод транспорта для данных Media между Peer to Peer. Понял. Также он работает поверх RTP/UDP. Это также понятно.

При обсуждении сервера Signaling упоминается, что требуется выполнить проверку совместимости/инициирование канала.. и так далее.

Мой вопрос: сказав выше,

1) Означает ли это, что сервер сигнализации является обязательным?

2) Разве WebRTC не имеет интеллект, чтобы напрямую разговаривать с другим партнером без сервера signaing?

3) Каждая статья, связанная с webRTC, начинается с состояния "Между браузером и браузером?". Означает ли это, что webRTC нельзя использовать между a) Встроенным устройством с камерой [Без браузера], b) браузером где-нибудь еще.

4) Кроме того, что такое коэффициент усиления, если используется webRTC по сравнению с традиционным способом потоковой передачи в браузер? [Я, честно говоря, не знаю унаследованного пути].

Я знаю, что это теоретический вопрос. Хотя, я вижу, что этот вопрос, вероятно, в разных контекстах плавает в Интернете. Надеюсь, что этот вопрос даст некоторые ответы на уровень архитектуры. Спасибо.

4b9b3361

Ответ 1

WebRTC не разрешает обнаружение (и не должен).

WebRTC знает, как разговаривать напрямую с другим партнером без сервера сигнализации, но он не знает, как обнаружить другого партнера. Discovery - это неотъемлемая проблема, поэтому я немного озадачен тем, что люди ожидают, что WebRTC решит ее для них.

Подумайте об этом: как вы меня назовете? Как вы собираетесь направить свой компьютер, чтобы начать со мной контакт, а не с миллиардом других людей? По GPS-координатам? адрес электронной почты? Статический IP? ИРЦ? мгновенное сообщение? facebook? номер телефона?

Также, как я узнаю, когда вы позвоните? Будет ли мой компьютер "звонить"? Есть сотни способов решить эту проблему с помощью обычных веб-технологий, поэтому WebRTC будет делать вам плохую услугу, если она продиктована определенным образом. Контекст вашего приложения, скорее всего, будет информировать о лучших способах общения. Возможно, я встречаюсь с вами в каком-то онлайн-форуме или виртуальной комнате в онлайн-игре?

С технической точки зрения, вам не нужен сервер сигнализации с WebRTC, если у вас есть другие способы получить предложение SDP (кусок текста) вашему сверстнику и получить ответ обратной SDP в ответ, это по телефону, IM, irc, электронной почте или перевозчику. Попробуйте это в Chrome или Firefox: https://jsfiddle.net/nnc13tw2 - нажмите "Предложение" (подождите до 20 секунд), отправьте результат своему другу, который вставляет его в одно и то же поле на их конце и нажмите Enter, и попросите их отправить ответ, который вы вставляете в поле ответа, и нажмите Enter. Теперь вы должны быть подключены, и никакой подключающий сервер не был задействован.

Почему работает jsfiddle: он упаковывает всех кандидатов ICE в SDP, что может занять несколько секунд, чтобы дать вам все, что вам нужно за один раз.

Некоторые дополнительные функции, такие как изменение количества видеоисточников в середине вызова и т.д., также требуют сигнализации, но как только звонок был установлен, приложение может использовать свои собственные каналы передачи данных для любых дальнейших потребностей в сигнализации между одноранговыми узлами.

В Stackoverflow теперь требуется включить код для ссылки на jsfiddle, поэтому Я мог бы также включить его здесь (хотя, если вы используете Chrome, используйте скрипку выше, поскольку доступ к фотокамере не работает в фрагментах):

var config = { iceServers: [{ urls: "stun:stun.l.google.com:19302" }]};

var dc, pc = new RTCPeerConnection(config);
pc.onaddstream = e => v2.srcObject = e.stream;
pc.ondatachannel = e => dcInit(dc = e.channel);
v2.onloadedmetadata = e => log("Connected!");

var haveGum = navigator.mediaDevices.getUserMedia({video:true, audio:true})
  .then(stream => pc.addStream(v1.srcObject = stream))
  .catch(failed);

function dcInit() {
  dc.onopen = () => log("Chat!");
  dc.onmessage = e => log(e.data);
}

function createOffer() {
  button.disabled = true;
  dcInit(dc = pc.createDataChannel("chat"));
  haveGum.then(() => pc.createOffer()).then(d => pc.setLocalDescription(d)).catch(failed);
  pc.onicecandidate = e => {
    if (e.candidate) return;
    offer.value = pc.localDescription.sdp;
    offer.select();
    answer.placeholder = "Paste answer here";
  };
};

offer.onkeypress = e => {
  if (!enterPressed(e) || pc.signalingState != "stable") return;
  button.disabled = offer.disabled = true;
  var desc = new RTCSessionDescription({ type:"offer", sdp:offer.value });
  pc.setRemoteDescription(desc)
    .then(() => pc.createAnswer()).then(d => pc.setLocalDescription(d))
    .catch(failed);
  pc.onicecandidate = e => {
    if (e.candidate) return;
    answer.focus();
    answer.value = pc.localDescription.sdp;
    answer.select();
  };
};

answer.onkeypress = e => {
  if (!enterPressed(e) || pc.signalingState != "have-local-offer") return;
  answer.disabled = true;
  var desc = new RTCSessionDescription({ type:"answer", sdp:answer.value });
  pc.setRemoteDescription(desc).catch(failed);
};

chat.onkeypress = e => {
  if (!enterPressed(e)) return;
  dc.send(chat.value);
  log(chat.value);
  chat.value = "";
};

var enterPressed = e => e.keyCode == 13;
var log = msg => div.innerHTML += "<p>" + msg + "</p>";
var failed = e => log(e);
<video id="v1" height="120" width="160" autoplay muted></video>
<video id="v2" height="120" width="160" autoplay></video><br>
<button id="button" onclick="createOffer()">Offer:</button>
<textarea id="offer" placeholder="Paste offer here"></textarea><br>
Answer: <textarea id="answer"></textarea><br><div id="div"></div>
Chat: <input id="chat"></input><br>
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>

Ответ 2

  • Да, сигнализация является обязательной, так что кандидаты ICE и т.д. меняются, так что одноранговое соединение знает, кто его партнер
  • Нет, как бы он знал своего партнера без какого-либо обмена?
  • Нет, это не значит. Я провел множество экспериментов, работающих с raspis, и другими родными устройствами, которые передают видео на страницу браузера через одноранговое соединение WebRTC.
  • О чем ты говоришь? Вы имеете в виду прирост использования WebRTC против Flash и центрального сервера? WebRTC является равным, и если вы связываете это с GetUserMedia и Html5, вы избавляетесь от необходимости использования флеш-памяти и центрального медиа-сервера для обработки всех медиа-обменов.

Ответ 3

Вам нужен сервер сигнализации, чтобы иметь возможность установить соединение между двумя произвольными одноранговыми узлами; это простая реальность интернет-архитектуры, используемой сегодня.

Чтобы связаться с другим партнером в Интернете, вам необходимо сначала узнать его IP-адрес. Там уже первая проблема. Вам нужно знать, что такое IP-адрес вашего партнера. Как вы собираетесь получать эту информацию от однорангового узла A до партнера B, если люди, сидящие на этих компьютерах, не звонят друг другу по телефону и не диктуют IP-адресаты? Для этого каждый сверстник сначала обнаруживает свой собственный адрес, а затем отправляет его другому партнеру. Это открывает еще две проблемы: как одноранговый узел обнаруживает, что его внешний адрес IP-адрес (который может существенно отличаться от его собственного IP-адреса), и как он передает это сообщение другому равно неизвестному адресу?

Здесь подключается сервер сигнализации. Оба одноранговых узла имеют соединение с сервером сигнализации, прежде чем они имеют соединение друг с другом. Поэтому они используют сервер сигнализации для передачи сообщений от их имени, пока они не договорились о прямом способе говорить. Можно было бы договориться о подключении без сторонней помощи в локальных подсетях; но этот сценарий, вероятно, достаточно редок, что я даже не уверен, что спецификация обращается к нему.

Что касается 3): WebRTC может быть реализован на любом устройстве, это всего лишь протокол; он не привязан исключительно к браузерам.

Что касается 4): "устаревший" способ потоковой передачи чего-либо из одного браузера в другой всегда включал сервер ретрансляции посередине. Этот сервер имеет большие требования к процессору и пропускной способности и является дорогостоящим узким местом. WebRTC позволяет напрямую подключать P2P без посредников, за исключением легкого сервера сигнализации. Кроме того, раньше не было открытого стандарта; большую часть времени вы будете платить деньги Adobe так или иначе.

Ответ 4

Большая часть ответа была покрыта, просто подумал, что я кое-что добавлю. Когда Google впервые создал webRTC и открыл его 4 года назад, он сделал это строго по своему усмотрению без каких-либо возможностей сигнализации.

Однако недавно Google купил Firebase, поэтому я бы сказал, что вскоре они будут открыты для поиска полного сквозного решения для WebRTC, чтобы все мы могли ускорить его реализацию.

Говоря о Firebase, я попробовал это, и это неплохо, выполнил основную работу: http://antonvolt.com/prototype2/