From a3b21d448a42db992b47af6c2de450a8093025e7 Mon Sep 17 00:00:00 2001 From: Nick Mowen Date: Sat, 15 Oct 2022 13:42:14 -0600 Subject: [PATCH] Improvements to webRTC --- web/src/components/WebRtcPlayer.jsx | 93 ++++++++++++++++++----------- web/src/routes/Camera.jsx | 2 +- 2 files changed, 60 insertions(+), 35 deletions(-) diff --git a/web/src/components/WebRtcPlayer.jsx b/web/src/components/WebRtcPlayer.jsx index 4db47d48b..cf8edf634 100644 --- a/web/src/components/WebRtcPlayer.jsx +++ b/web/src/components/WebRtcPlayer.jsx @@ -1,49 +1,74 @@ import { h } from 'preact'; import { useRef, useEffect } from 'preact/hooks'; -export default function WebRtcPlayer({ camera }) { - const playerRef = useRef(); +let ws; - useEffect(() => { - let ws = new WebSocket('ws://192.168.50.106:1984/api/ws'); - ws.onopen = () => { - - }; - - const pc = new RTCPeerConnection({ - iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], +function initStream() { + console.log('Doing a thing'); + ws = new WebSocket('ws://127.0.0.1:1984/api/ws?src=garage_cam'); + ws.onopen = () => { + console.log('ws.onopen'); + pc.createOffer().then(offer => { + pc.setLocalDescription(offer).then(() => { + console.log(offer.sdp); + const msg = {type: 'webrtc/offer', value: pc.localDescription.sdp}; + ws.send(JSON.stringify(msg)); + }); }); - pc.onicecandidate = ev => { - if (ev.candidate !== null) { - ws.send(JSON.stringify({ - type: 'webrtc/candidate', value: ev.candidate.toJSON().candidate, - })); - } + } + ws.onerror = e => { + console.log("There was a ws error " + e.type); + } + ws.onmessage = ev => { + const msg = JSON.parse(ev.data); + console.log('ws.onmessage', msg); + + if (msg.type === 'webrtc/candidate') { + pc.addIceCandidate({candidate: msg.value, sdpMid: ''}); + } else if (msg.type === 'webrtc/answer') { + pc.setRemoteDescription({type: 'answer', sdp: msg.value}); + pc.getTransceivers().forEach(t => { + if (t.receiver.track.kind === 'audio') { + t.currentDirection + } + }) } - pc.ontrack = ev => { - const video = document.getElementById('video'); + } - // when audio track not exist in Chrome - if (ev.streams.length === 0) return; - - // when audio track not exist in Firefox - if (ev.streams[0].id[0] === '{') return; - - // when stream already init - if (video.srcObject !== null) return; - - video.srcObject = ev.streams[0]; + const pc = new RTCPeerConnection({ + iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], + }); + pc.onicecandidate = ev => { + if (ev.candidate !== null) { + ws.send(JSON.stringify({ + type: 'webrtc/candidate', value: ev.candidate.toJSON().candidate, + })); } + } + pc.ontrack = ev => { + const video = document.getElementById('video'); - // Safari don't support "offerToReceiveVideo" - // so need to create transeivers manually - pc.addTransceiver('video', {direction: 'recvonly'}); - pc.addTransceiver('audio', {direction: 'recvonly'}); - }, []); // eslint-disable-line react-hooks/exhaustive-deps + // when audio track not exist in Chrome + if (ev.streams.length === 0) return; + // when audio track not exist in Firefox + if (ev.streams[0].id[0] === '{') return; + // when stream already init + if (video.srcObject !== null) return; + video.srcObject = ev.streams[0]; + } + + // Safari don't support "offerToReceiveVideo" + // so need to create transeivers manually + pc.addTransceiver('video', {direction: 'recvonly'}); + pc.addTransceiver('audio', {direction: 'recvonly'}); +} + +export default function WebRtcPlayer({ camera, width, height }) { + initStream(); return (
-
); } \ No newline at end of file diff --git a/web/src/routes/Camera.jsx b/web/src/routes/Camera.jsx index 720f74d94..4d1a82dc0 100644 --- a/web/src/routes/Camera.jsx +++ b/web/src/routes/Camera.jsx @@ -123,7 +123,7 @@ export default function Camera({ camera }) { player = (
- +
)