WebRTC (Web Real-Time Communication) предоставляет возможность передачи аудио, видео и произвольных данных напрямую между браузерами без использования промежуточных серверов для мультимедийного контента. В контексте Vue.js это открывает возможности создания приложений для видеоконференций, потоковой передачи и обмена данными в реальном времени.
Для интеграции WebRTC с Vue.js оптимально использовать модульную структуру компонентов:
// Пример базового сервиса WebRTC
export default class WebRTCService {
constructor(localVideoRef, remoteVideoRef) {
this.localVideoRef = localVideoRef;
this.remoteVideoRef = remoteVideoRef;
this.peerConnection = new RTCPeerConnection();
}
async initLocalStream() {
const stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
this.localVideoRef.srcObject = stream;
stream.getTracks().forEach(track => this.peerConnection.addTrack(track, stream));
}
async createOffer() {
const offer = await this.peerConnection.createOffer();
await this.peerConnection.setLocalDescription(offer);
return offer;
}
async setRemoteDescription(sdp) {
await this.peerConnection.setRemoteDescription(new RTCSessionDescription(sdp));
}
addIceCandidate(candidate) {
this.peerConnection.addIceCandidate(new RTCIceCandidate(candidate));
}
setupRemoteStream() {
this.peerConnection.ontr ack = (event) => {
this.remoteVideoRef.srcObject = event.streams[0];
};
}
}
WebRTC не предоставляет встроенной сигнализации, поэтому необходимо создать механизм обмена SDP и ICE-кандидатами. Чаще всего для этого используют WebSocket:
const socket = new WebSocket('wss://example.com/signaling');
socket.onmess age = async (message) => {
const data = JSON.parse(message.data);
switch(data.type) {
case 'offer':
await webRTCService.setRemoteDescription(data.offer);
const answer = await webRTCService.createAnswer();
socket.send(JSON.stringify({ type: 'answer', answer }));
break;
case 'ice-candidate':
webRTCService.addIceCandidate(data.candidate);
break;
}
};
<template>
<div class="video-chat">
<video ref="localVideo" autoplay muted></video>
<video ref="remoteVideo" autoplay></video>
</div>
</template>
<script>
import WebRTCService from "@/services/WebRTCService";
export default {
name: "VideoChat",
mounted() {
this.webRTCService = new WebRTCService(this.$refs.localVideo, this.$refs.remoteVideo);
this.webRTCService.initLocalStream();
this.webRTCService.setupRemoteStream();
}
};
</script>
<style scoped>
video {
width: 45%;
margin: 1%;
border-radius: 8px;
background-color: black;
}
.video-chat {
display: flex;
justify-content: center;
align-items: center;
}
</style>
ICE-кандидаты обеспечивают возможность установления прямого соединения между браузерами через NAT и брандмауэры. В Vue.js важно:
onicecandidate
PeerConnection.addIceCandidate.this.peerConnection.onicecandid ate = (event) => {
if(event.candidate) {
socket.send(JSON.stringify({ type: 'ice-candidate', candidate: event.candidate }));
}
};
navigator.mediaDevices.getDisplayMedia().Vue.js обеспечивает реактивность данных, что позволяет динамически обновлять UI при изменении состояния соединения:
data() {
return {
connectionState: 'disconnected',
};
},
mounted() {
this.webRTCService.peerConnection.onconnectionstatecha nge = () => {
this.connectionState = this.webRTCService.peerConnection.connectionState;
};
}
Реактивные свойства позволяют отображать состояние подключения, активность потоков и уведомления о потерях соединения.
requestAnimationFrame для обновления UI
при обработке видео.beforeUnmount() {
this.webRTCService.peerConnection.close();
this.$refs.localVideo.srcObject = null;
this.$refs.remoteVideo.srcObject = null;
}
https обязательно для работы
getUserMedia.Интеграция WebRTC в Vue.js позволяет создавать полнофункциональные приложения с видеосвязью, обменом данными и расширяемыми возможностями в реальном времени, сохраняя чистоту кода и реактивность интерфейса.