WebRTC (Web Real-Time Communications)
Это технология связи в режиме реального времени, которая позволяет веб-приложениям или сайтам устанавливать одноранговые (Peer-to-Peer
) соединение для реализации передачи видеопотока и/или аудиопотока или других произвольных данных.WebRTC
Включенные стандарты позволяют пользователям создавать одноранговые (Peer-to-Peer
) возможен обмен данными и конференц-связь.
Эта статья начинается с собственной практики и объединяет соответствующие коды для обобщенияWebRTC
Основной процесс реализации.
1. Введение
Во-первых, давайте посмотрим наWebRTC
Из блок-схемы, приведенной в The Authoritative Guide, нам нужно прояснить две вещи:
- Во-первых, две взаимодействующие стороны должны сначала обменяться некоторой информацией через сервер.
- Во-вторых, после завершения обмена информацией две взаимодействующие стороны будут напрямую подключаться для передачи данных.
Затем мы вводимWebRTC
Собственные существительные в , чтобы облегчить понимание читателем следующего.
-
RTCPeerConnection
: основной объект, каждый объект подключения должен создавать новый объект -
SDP
(Session Description Protocol
, Протокол описания сеанса): содержит некоторую необходимую информацию для установления соединения, напримерIP
адрес и т.д.sdp
Зависит отRTCPeerConnection
Создание метода объекта, в настоящее время нам не нужно знать конкретное содержимое объекта, просто используйте передачу черного ящика -
ICE
(Interactive Connectivity Establishment
, технология интерактивного установления соединения): способ установления соединения между пользователями, который используется для выбора наилучшего метода соединения между пользователями.
2. Процесс внедрения WebRTC
Следующий код не может быть запущен напрямую, потому что я не реализовал здесь сигнальный сервер, а то, как реализовать сигнальный сервер, может быть выбрано свободно (например,socket.io, веб-сокет и т. д.).
Сначала инициатор получает видеопоток и в случае успеха создает новыйRTCPeerConnection
объект, затем создайтеoffer
, и отправьте ответчику.
-
addStream
метод будетgetUserMedia
Поток, полученный в методе (stream
)добавить вRTCPeerConnection
объект для передачи -
onaddStream
События используются для прослушивания новых добавленных потоков в канал черезe.stream
Получать -
onicecandidate
события используются для поиска подходящихICE
-
createOffer()
даRTCPeerConnection
Собственные методы объекта, используемые для созданияoffer
, вызов после успешного созданияsetLocalDescription
метод будетlocalDescription
Установить какoffer
,localDescription
Это то, что нам нужно отправить ответчикуsdp
-
sendOffer
а такжеsendCandidate
метод — это пользовательский метод, используемый для отправки данных на сервер.
// 引入<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>脚本
// 提升浏览器兼容性
var localConnection
var constraints={
audio:false,
video:true
}
navigator.mediaDevices.getUserMedia(constraints).then(handleSuccess).catch(handleError)
function handleSuccess(stream) {
document.getElementById("video").srcObject = stream
localConnection=new RTCPeerConnection()
localConnection.addStream(stream)
localConnection.onaddstream=function(e) {
console.log('获得应答方的视频流' + e.stream)
}
localConnection.onicecandidate=function(event){
if(event.candidate){
sendCandidate(event.candidate)
}
}
localConnection.createOffer().then((offer)=>{
localConnection.setLocalDescription(offer).then(sendOffer)
})
}
Точно так же получатель также должен создать новыйRTCPeerConnection
объект
var remoteConnection
var constraints={
audio:false,
video:true
}
}
navigator.mediaDevices.getUserMedia(constraints).then(handleSuccess).catch(handleError)
function handleSuccess(stream) {
document.getElementById("video").srcObject = stream
remoteConnection=new RTCPeerConnection()
remoteConnection.addStream(stream)
remoteConnection.onaddstream=function(e) {
console.log('获得发起方的视频流' + e.stream)
}
remoteConnection.onicecandidate=function(event){
if(event.candidate){
sendCandidate(event.candidate)
}
}
}
Когда ответчик получаетoffer
После этого позвонитеsetRemoteDescription
настраиватьRTCPeerConnection
объектremoteDescription
свойство, которое вызывается после успешной установкиcreateAnswer
метод, создатьanswer
После успеха установите его наlocalDescription
, затем поставьтеanswer
отправить на сервер
let desc=new RTCSessionDescription(sdp)
remoteConnection.setRemoteDescription(desc).then(function() {
remoteConnection.createAnswer().then((answer)=>{
remoteConnection.setLocalDescription(answer).then(sendAnswer)
})
})
Когда инициатор получает сообщение, отправленное ответчикомanswer
После этого установите его наremoteDescription
, слишком далекоWebRTC
Соединение завершено.
let desc=new RTCSessionDescription(sdp)
localConnection.setRemoteDescription(desc).then(()=>{console.log('Peer Connection Success')})
Хотя в это времяWebRTC
Соединение установлено, но две взаимодействующие стороны не могут общаться напрямую, потому чтоICE
С этим не разобрались, и стороны связи еще не определили оптимальный способ подключения.
Ответчик получает сообщение, отправленное инициаторомICE
данные, звонокRTCPeerConnection
объектaddIceCandidate
метод.
remoteConnection.addIceCandidate(new RTCIceCandidate(ice))
Инициатор получает сообщение, отправленное ответчикомICE
данные, тот же вызовRTCPeerConnection
объектaddIceCandidate
метод.
localConnection.addIceCandidate(new RTCIceCandidate(ice))
Пока самый простойWebRTC
Связь установлена.
3. Канал данных
WebRTC
Хорошо передает данные, не только аудио- и видеопотоки, но и любой тип данных, который мы хотим, по сравнению со сложным процессом обмена данными, основная функция создания канала данных уже вRTCDataConnection
Объект реализует:
var peerConnection = new RTCPeerConnection();
var dataChannel = peerConnection.createDataChannel("label",dataChannelOptions);
WebRTC
Позаботится обо всем, включая внутренний слой браузера. Браузер уведомляет приложение о текущем состоянии канала данных посредством ряда событий.ondatachannel
События будут уведомленыRTCPeerConnection
объект,RTCDataChannel
Сам объект инициирует соответствующие события при включении, выключении, возникновении ошибки или получении сообщения.
dataChannel.onerror = function (error){
console.log(error)
}
dataChannel.onmessage = function (event){
console.log(event.data)
}
dataChannel.onopen = function (error){
console.log('data channel opened')
// 当创建一个数据通道后,你必须等onopen事件触发后才能发送消息
dataChannel.send('Hello world')
}
dataChannel.onclose = function (error){
console.log('data channel closed')
}
канал данныхdatachannel
Процесс установления немного отличается от установления двунаправленного соединения для потоковой передачи видео или аудио.offer、answer、ice
После завершения обработки одна сторона может инициировать запрос.
localConnection = new RTCPeerConnection();
sendChannel = localConnection.createDataChannel("sendChannel");
sendChannel.onopen = handleSendChannelStatusChange;
sendChannel.onclose = handleSendChannelStatusChange;
Получателю не нужно снова звонить в это времяcreateDataChannel
Метод, просто слушайRTCPeerConnection
на объект экземпляраondatachannel
Событие может получить запрос отправителя в обратном вызове, и канал данных установлен.
remoteConnection = new RTCPeerConnection();
remoteConnection.ondatachannel = receiveChannelCallback;
function receiveChannelCallback(event) {
receiveChannel = event.channel;
receiveChannel.onmessage = handleReceiveMessage;
receiveChannel.onopen = handleReceiveChannelStatusChange;
receiveChannel.onclose = handleReceiveChannelStatusChange;
}
dataChannelOptions
Входящий элемент конфигурации является необязательным и является общимJavaScript
объект, эти элементы конфигурации могут сделать приложение вUDP
илиTCP
изменения между преимуществами.
-
reliable
: Установите, гарантируется ли сообщение -
ordered
: Установите, должно ли быть принято сообщение в том порядке, в котором оно было отправлено. -
maxRetransmitTime
: Установите, как долго будет повторно отправляться сообщение, если оно не может быть отправлено. -
maxRetransmits
: Установите максимальное количество повторных передач, когда сообщение не может быть отправлено. -
protocol
: установите принудительное использование других подпротоколов, но будет сообщено об ошибке, если пользовательский агент не поддерживает этот протокол. -
negotiated
: устанавливает, обязан ли разработчик создать канал данных с обеих сторон, или браузер делает это автоматически -
id
: Установите уникальный идентификатор канала.
4. Общий доступ к файлам
В настоящее время каналы данных поддерживают следующие типы:
-
String
:JavaScript
основная строка -
Blob(binary large object)
: бинарный большой объект -
ArrayBuffer
: тип данных, определяющий длину массива. -
ArrayBufferView
: базовый вид массива
в,Blob
Тип — это контейнер, в котором могут храниться двоичные файлы в сочетании сHTML5
Чтение связанного файлаAPI
, может реализовать функцию обмена файлами.
5. Еще
Документация MDN:>>>Нажмите на меня, чтобы войти
Учебные материалы WebRTC:>>>Нажмите на меня, чтобы войти
Официальный адрес на гитхабе:>>>Нажмите на меня, чтобы войти
Разбор поля SDP:>>>Нажмите на меня, чтобы войти
Адрес персонального демо-кода:>>>Нажмите на меня, чтобы войти
Книги "Официальное руководство по WebRTC", "Изучение WebRTC на китайском языке"