mirror of
https://github.com/blakeblackshear/frigate.git
synced 2024-11-21 19:07:46 +01:00
Add micropohone button for two way talk (#10408)
This commit is contained in:
parent
9e10b914c9
commit
92255f771b
@ -20,6 +20,7 @@ type LivePlayerProps = {
|
||||
showStillWithoutActivity?: boolean;
|
||||
windowVisible?: boolean;
|
||||
playAudio?: boolean;
|
||||
micEnabled?: boolean; // only webrtc supports mic
|
||||
onClick?: () => void;
|
||||
};
|
||||
|
||||
@ -30,6 +31,7 @@ export default function LivePlayer({
|
||||
showStillWithoutActivity = true,
|
||||
windowVisible = true,
|
||||
playAudio = false,
|
||||
micEnabled = false,
|
||||
onClick,
|
||||
}: LivePlayerProps) {
|
||||
// camera activity
|
||||
@ -97,6 +99,7 @@ export default function LivePlayer({
|
||||
camera={cameraConfig.live.stream_name}
|
||||
playbackEnabled={cameraActive}
|
||||
audioEnabled={playAudio}
|
||||
microphoneEnabled={micEnabled}
|
||||
onPlaying={() => setLiveReady(true)}
|
||||
/>
|
||||
);
|
||||
|
@ -6,6 +6,7 @@ type WebRtcPlayerProps = {
|
||||
camera: string;
|
||||
playbackEnabled?: boolean;
|
||||
audioEnabled?: boolean;
|
||||
microphoneEnabled?: boolean;
|
||||
onPlaying?: () => void;
|
||||
};
|
||||
|
||||
@ -14,6 +15,7 @@ export default function WebRtcPlayer({
|
||||
camera,
|
||||
playbackEnabled = true,
|
||||
audioEnabled = false,
|
||||
microphoneEnabled = false,
|
||||
onPlaying,
|
||||
}: WebRtcPlayerProps) {
|
||||
// camera states
|
||||
@ -145,7 +147,9 @@ export default function WebRtcPlayer({
|
||||
"ws",
|
||||
)}live/webrtc/api/ws?src=${camera}`;
|
||||
const ws = new WebSocket(url);
|
||||
const aPc = PeerConnection("video+audio");
|
||||
const aPc = PeerConnection(
|
||||
microphoneEnabled ? "video+audio+microphone" : "video+audio",
|
||||
);
|
||||
connect(ws, aPc);
|
||||
|
||||
return () => {
|
||||
@ -154,7 +158,15 @@ export default function WebRtcPlayer({
|
||||
pcRef.current = undefined;
|
||||
}
|
||||
};
|
||||
}, [camera, connect, PeerConnection, pcRef, videoRef, playbackEnabled]);
|
||||
}, [
|
||||
camera,
|
||||
connect,
|
||||
PeerConnection,
|
||||
pcRef,
|
||||
videoRef,
|
||||
playbackEnabled,
|
||||
microphoneEnabled,
|
||||
]);
|
||||
|
||||
return (
|
||||
<video
|
||||
|
@ -40,6 +40,8 @@ import {
|
||||
FaAngleUp,
|
||||
FaCompress,
|
||||
FaExpand,
|
||||
FaMicrophone,
|
||||
FaMicrophoneSlash,
|
||||
} from "react-icons/fa";
|
||||
import { GiSpeaker, GiSpeakerOff } from "react-icons/gi";
|
||||
import { IoMdArrowBack } from "react-icons/io";
|
||||
@ -98,6 +100,7 @@ export default function LiveCameraView({ camera }: LiveCameraViewProps) {
|
||||
// playback state
|
||||
|
||||
const [audio, setAudio] = useState(false);
|
||||
const [mic, setMic] = useState(false);
|
||||
const [fullscreen, setFullscreen] = useState(false);
|
||||
|
||||
const growClassName = useMemo(() => {
|
||||
@ -190,6 +193,16 @@ export default function LiveCameraView({ camera }: LiveCameraViewProps) {
|
||||
}
|
||||
}}
|
||||
/>
|
||||
{window.isSecureContext && (
|
||||
<CameraFeatureToggle
|
||||
className="p-2 md:p-0"
|
||||
variant={fullscreen ? "overlay" : "primary"}
|
||||
Icon={mic ? FaMicrophone : FaMicrophoneSlash}
|
||||
isActive={mic}
|
||||
title={`${mic ? "Disable" : "Enable"} Two Way Talk`}
|
||||
onClick={() => setMic(!mic)}
|
||||
/>
|
||||
)}
|
||||
<CameraFeatureToggle
|
||||
className="p-2 md:p-0"
|
||||
variant={fullscreen ? "overlay" : "primary"}
|
||||
@ -249,7 +262,8 @@ export default function LiveCameraView({ camera }: LiveCameraViewProps) {
|
||||
showStillWithoutActivity={false}
|
||||
cameraConfig={camera}
|
||||
playAudio={audio}
|
||||
preferredLiveMode={isSafari ? "webrtc" : "mse"}
|
||||
micEnabled={mic}
|
||||
preferredLiveMode={isSafari || mic ? "webrtc" : "mse"}
|
||||
/>
|
||||
</div>
|
||||
{camera.onvif.host != "" && <PtzControlPanel camera={camera.name} />}
|
||||
@ -410,7 +424,10 @@ function PtzControlPanel({ camera }: { camera: string }) {
|
||||
<DropdownMenuContent>
|
||||
{ptz?.presets.map((preset) => {
|
||||
return (
|
||||
<DropdownMenuItem onSelect={() => sendPtz(`preset_${preset}`)}>
|
||||
<DropdownMenuItem
|
||||
key={preset}
|
||||
onSelect={() => sendPtz(`preset_${preset}`)}
|
||||
>
|
||||
{preset}
|
||||
</DropdownMenuItem>
|
||||
);
|
||||
|
Loading…
Reference in New Issue
Block a user