frigate/web/src/components/player/RecordingPlaybackPreferenceSelect.tsx

37 lines
1.0 KiB
TypeScript
Raw Normal View History

Added substream support, dynamic substream creation, and playback methods for This change adds first-class adaptive recording playback using main and sub recording variants. Frigate can now store multiple recording variants per camera, expose those variants through the recordings API, and serve variant-specific VOD playlists through routes such as /vod/variant/sub/.... The UI now uses the available recording variants and browser playback capability to choose an appropriate playback source, with a user-selectable Auto, Main, and Sub preference. This is applied across timeline playback, export preview, and object detail playback. The backend also includes a fallback path for sub playback: when a native sub recording is not available for a requested time range, Frigate can generate a lower-resolution sub recording from the main segment, store it under the standard sub variant, and mark it with transcoded_from_main. Additional changes include recording metadata for codec, resolution, bitrate, and variant; database migrations for recording variants and generated-sub tracking; tests for variant VOD selection and fallback behavior; improved storage graph sorting; and a small MQTT TLS guard so tls_insecure is only applied when TLS is configured. Substream Configuration Examples Record the main stream as the normal full-resolution recording and also record the camera substream as the sub variant: cameras: front_door: ffmpeg: inputs: - path: rtsp://user:password@192.168.1.10:554/main roles: - record record_variant: main - path: rtsp://user:password@192.168.1.10:554/sub roles: - detect - record record_variant: sub detect: width: 640 height: 360 fps: 5 record: enabled: true Using go2rtc restreams: go2rtc: streams: front_door: - rtsp://user:password@192.168.1.10:554/main front_door_sub: - rtsp://user:password@192.168.1.10:554/sub cameras: front_door: ffmpeg: inputs: - path: rtsp://127.0.0.1:8554/front_door input_args: preset-rtsp-restream roles: - record record_variant: main - path: rtsp://127.0.0.1:8554/front_door_sub input_args: preset-rtsp-restream roles: - detect - record record_variant: sub detect: width: 640 height: 360 fps: 5 record: enabled: true If record_variant is omitted on a record input, it defaults to main. Each camera can only use a given recording variant once, so the main and sub recording inputs should use distinct variant names.
2026-04-30 05:05:59 +03:00
import { RecordingPlaybackPreference } from "@/types/record";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { useTranslation } from "react-i18next";
type RecordingPlaybackPreferenceSelectProps = {
className?: string;
onValueChange: (value: RecordingPlaybackPreference) => void;
value: RecordingPlaybackPreference;
};
export default function RecordingPlaybackPreferenceSelect({
className,
onValueChange,
value,
}: RecordingPlaybackPreferenceSelectProps) {
const { t } = useTranslation(["components/player"]);
return (
<Select value={value} onValueChange={onValueChange}>
<SelectTrigger className={className}>
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="auto">{t("playbackPreference.auto")}</SelectItem>
<SelectItem value="main">{t("playbackPreference.main")}</SelectItem>
<SelectItem value="sub">{t("playbackPreference.sub")}</SelectItem>
</SelectContent>
</Select>
);
}