mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-03 17:55:21 +03:00
* Pull go2rtc dependency * Add go2rtc to local services and add to s6 * Add relay controller for go2rtc * Add restream role * Add restream role * Add restream to nginx * Add camera live source config * Disable RTMP by default and use restream * Use go2rtc for camera config * Fix go2rtc move * Start restream on frigate start * Send restream to camera level * Fix restream * Make sure jsmpeg works as expected * Make view rspect live size config * Tweak player options to fit live view * Adjust VideoPlayer to accept live option which disables irrelevant controls * Add multiple options from restream live view * Add base for webrtc option * Setup specific restream modules * Make mp4 the default streaming for now * Expose 8554 for rtsp relay from go2rtc * Formatting * Update docs to suggest new restream method. * Update docs to reflect restream role * Update docs to reflect restream role * Add webrtc player * Improvements to webRTC * Support webrtc * Cleanup * Adjust rtmp test and add restream test * Fix tests * Add restream tests * Add live view docs and show different options * Small docs tweak * Support all stream types * Update to beta 9 of go2rtc * Formatting * Make jsmpeg the default * Support wss if made from https * Support wss if made from https * Use onEffect * Set url outside onEffect * Fix passed deps * Update docs about required host mode * Try memo instead * Close websocket on changing camera * Formatting * Close pc connection * Set video source to null on cleanup * Use full path since go2rtc can't see PATH var * Adjust audio codec to enable browser audio by default * Cleanup stream creation * Add restream tests * Format tests * Mock requests * Adjust paths * Move stream configs to restream * Remove live source * Remove live config * Use live persistence for which view to use on each camera * Fix live sizes * Only use jsmpeg sizes for jsmpeg live * Set max live size * Remove access of live config * Add selector for live view source in web view * Remove RTMP from default list of roles * Update docs * Fix tests * Fix docs for live view modes * make default undefined to avoid race condition * Wait until camera source is loaded to avoid race condition * Fix tests * Add config to go2rtc * Work with config * Set full path for config * Set to use stun * Check for mounted file * Look for frigate-go2rtc * Update docs to reflect webRTC configuration. * Add link to go2rtc config * Update docs to be more clear * Update docs to be more clear * Update format Co-authored-by: Felipe Santos <felipecassiors@gmail.com> * Update live docs * Improve bash startup script * Add option to force audio compatibility * Formatting * Fix mapping * Fix broken link * Update go2rtc version * Get go2rtc webui working * Add support for mse * Remove mp4 option * Undo changes to video player * Update docs for new live view options * Make separate path for mse * Remove unused * Remove mp4 path * Try to get go2rtc proxy working * Try to get go2rtc proxy working * Remove unused callback * Allow websocket on restrea dashboard * Make mse default stream option * Fix mse sizing * don't assume roles is defined * Remove nginx mapping to go2rtc ui Co-authored-by: Felipe Santos <felipecassiors@gmail.com> Co-authored-by: Blake Blackshear <blakeb@blakeshome.com>
101 lines
2.9 KiB
JavaScript
101 lines
2.9 KiB
JavaScript
import { h } from 'preact';
|
|
import { useRef, useEffect } from 'preact/hooks';
|
|
import videojs from 'video.js';
|
|
import 'videojs-playlist';
|
|
import 'videojs-seek-buttons';
|
|
import 'video.js/dist/video-js.css';
|
|
import 'videojs-seek-buttons/dist/videojs-seek-buttons.css';
|
|
|
|
export default function VideoPlayer({ children, options, seekOptions = {}, onReady = () => {}, onDispose = () => {} }) {
|
|
const playerRef = useRef();
|
|
|
|
useEffect(() => {
|
|
const defaultOptions = {
|
|
controls: true,
|
|
playbackRates: [0.5, 1, 2, 4, 8],
|
|
fluid: true,
|
|
};
|
|
|
|
const defaultSeekOptions = {
|
|
forward: 30,
|
|
back: 10,
|
|
};
|
|
|
|
if (!videojs.browser.IS_FIREFOX) {
|
|
defaultOptions.playbackRates.push(16);
|
|
}
|
|
|
|
const player = videojs(playerRef.current, { ...defaultOptions, ...options }, () => {
|
|
onReady(player);
|
|
});
|
|
player.seekButtons({
|
|
...defaultSeekOptions,
|
|
...seekOptions,
|
|
});
|
|
|
|
// Disable fullscreen on iOS if we have children
|
|
if (
|
|
children &&
|
|
videojs.browser.IS_IOS &&
|
|
videojs.browser.IOS_VERSION > 9 &&
|
|
!player.el_.ownerDocument.querySelector('.bc-iframe')
|
|
) {
|
|
player.tech_.el_.setAttribute('playsinline', 'playsinline');
|
|
player.tech_.supportsFullScreen = function () {
|
|
return false;
|
|
};
|
|
}
|
|
|
|
const screen = window.screen;
|
|
|
|
const angle = () => {
|
|
// iOS
|
|
if (typeof window.orientation === 'number') {
|
|
return window.orientation;
|
|
}
|
|
// Android
|
|
if (screen && screen.orientation && screen.orientation.angle) {
|
|
return window.orientation;
|
|
}
|
|
videojs.log('angle unknown');
|
|
return 0;
|
|
};
|
|
|
|
const rotationHandler = () => {
|
|
const currentAngle = angle();
|
|
|
|
if (currentAngle === 90 || currentAngle === 270 || currentAngle === -90) {
|
|
if (player.paused() === false) {
|
|
player.requestFullscreen();
|
|
}
|
|
}
|
|
|
|
if ((currentAngle === 0 || currentAngle === 180) && player.isFullscreen()) {
|
|
player.exitFullscreen();
|
|
}
|
|
};
|
|
|
|
if (videojs.browser.IS_IOS) {
|
|
window.addEventListener('orientationchange', rotationHandler);
|
|
} else if (videojs.browser.IS_ANDROID && screen.orientation) {
|
|
// addEventListener('orientationchange') is not a user interaction on Android
|
|
screen.orientation.onchange = rotationHandler;
|
|
}
|
|
|
|
return () => {
|
|
if (videojs.browser.IS_IOS) {
|
|
window.removeEventListener('orientationchange', rotationHandler);
|
|
}
|
|
player.dispose();
|
|
onDispose();
|
|
};
|
|
}, []); // eslint-disable-line react-hooks/exhaustive-deps
|
|
|
|
return (
|
|
<div data-vjs-player>
|
|
{/* Setting an empty data-setup is required to override the default values and allow video to be fit the size of its parent */}
|
|
<video ref={playerRef} className="small-player video-js vjs-default-skin" data-setup="{}" controls playsinline />
|
|
{children}
|
|
</div>
|
|
);
|
|
} |