frigate/web/src/components/WebRtcPlayer.jsx

67 lines
2.0 KiB
React
Raw Normal View History

2022-10-15 03:02:10 +03:00
import { h } from 'preact';
2022-10-21 18:31:16 +03:00
import { baseUrl } from '../api/baseUrl';
2022-10-21 18:28:11 +03:00
import { useEffect } from 'preact/hooks';
2022-10-15 03:02:10 +03:00
2022-10-21 18:28:11 +03:00
export default function WebRtcPlayer({ camera, width, height }) {
2022-10-21 18:31:16 +03:00
const url = `${baseUrl.replace(/^http/, 'ws')}go2rtc/api/ws?src=${camera}`;
2022-10-21 18:28:11 +03:00
useEffect(() => {
2022-10-21 18:31:16 +03:00
const ws = new WebSocket(url);
2022-10-21 18:28:11 +03:00
ws.onopen = () => {
pc.createOffer().then(offer => {
pc.setLocalDescription(offer).then(() => {
const msg = {type: 'webrtc/offer', value: pc.localDescription.sdp};
ws.send(JSON.stringify(msg));
});
2022-10-15 22:42:14 +03:00
});
2022-10-21 18:28:11 +03:00
}
ws.onmessage = ev => {
const msg = JSON.parse(ev.data);
2022-10-15 03:02:10 +03:00
2022-10-21 18:28:11 +03:00
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
}
})
}
2022-10-15 22:42:14 +03:00
}
2022-10-15 03:02:10 +03:00
2022-10-21 18:28:11 +03:00
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,
}));
}
2022-10-15 22:42:14 +03:00
}
2022-10-21 18:28:11 +03:00
pc.ontrack = ev => {
const video = document.getElementById('video');
2022-10-15 03:02:10 +03:00
2022-10-21 18:28:11 +03:00
// 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;
2022-10-15 03:02:10 +03:00
2022-10-21 18:28:11 +03:00
video.srcObject = ev.streams[0];
}
2022-10-15 03:02:10 +03:00
2022-10-21 18:28:11 +03:00
// Safari don't support "offerToReceiveVideo"
// so need to create transeivers manually
pc.addTransceiver('video', {direction: 'recvonly'});
pc.addTransceiver('audio', {direction: 'recvonly'});
2022-10-21 18:35:01 +03:00
}, [url]);
2022-10-15 03:02:10 +03:00
return (
<div>
2022-10-15 22:42:14 +03:00
<video id='video' autoplay playsinline controls muted width={width} height={height} />
2022-10-15 03:02:10 +03:00
</div>
);
}