Added RTSP cam script

This commit is contained in:
fwastring 2026-03-29 14:30:34 +02:00
parent 534f8199f3
commit 8c1db38398
3 changed files with 107 additions and 0 deletions

View file

@ -26,6 +26,7 @@ in
(modulesDirectory + /sound.nix) (modulesDirectory + /sound.nix)
(modulesDirectory + /services/base) (modulesDirectory + /services/base)
(modulesDirectory + /services/webcam-rtsp)
(modulesDirectory + /programs/hyprland) (modulesDirectory + /programs/hyprland)
(modulesDirectory + /programs/kubernetes-tools.nix) (modulesDirectory + /programs/kubernetes-tools.nix)
@ -46,6 +47,14 @@ in
base16Scheme = "${pkgs.base16-schemes}/share/themes/catppuccin-${theme}.yaml"; base16Scheme = "${pkgs.base16-schemes}/share/themes/catppuccin-${theme}.yaml";
}; };
webcam-rtsp = {
enable = true;
device = "/dev/v4l/by-id/usb-GENERAL_GENERAL_WEBCAM-video-index0";
rtspUrl = "rtsp://192.168.1.143:8554/laptop";
framerate = 30;
videoSize = "1280x720";
};
nixvim = { nixvim = {
enable = true; enable = true;
theme = theme; theme = theme;

View file

@ -0,0 +1,41 @@
{
lib,
config,
...
}:
with lib;
{
options = {
mediamtx = {
enable = mkEnableOption "enables mediamtx";
host = mkOption {
type = types.str;
default = "0.0.0.0";
description = "The host address to bind RTSP on.";
};
rtspPort = mkOption {
type = types.int;
default = 8554;
description = "RTSP port exposed by MediaMTX.";
};
};
};
config = mkMerge [
(mkIf config.mediamtx.enable {
virtualisation.podman.enable = true;
virtualisation.oci-containers = {
backend = "podman";
containers = {
mediamtx = {
image = "bluenviron/mediamtx:latest";
ports = [ "${config.mediamtx.host}:${toString config.mediamtx.rtspPort}:8554" ];
};
};
};
networking.firewall.allowedTCPPorts = [ config.mediamtx.rtspPort ];
})
];
}

View file

@ -0,0 +1,57 @@
{
lib,
config,
pkgs,
...
}:
with lib;
{
options = {
webcam-rtsp = {
enable = mkEnableOption "enables webcam RTSP publisher";
device = mkOption {
type = types.str;
default = "/dev/v4l/by-id/usb-GENERAL_GENERAL_WEBCAM-video-index0";
description = "V4L2 device used as input for ffmpeg.";
};
rtspUrl = mkOption {
type = types.str;
default = "rtsp://192.168.1.143:8554/laptop";
description = "Destination RTSP URL where ffmpeg publishes the stream.";
};
framerate = mkOption {
type = types.int;
default = 30;
description = "Input framerate for the webcam stream.";
};
videoSize = mkOption {
type = types.str;
default = "1280x720";
description = "Input video size for the webcam stream.";
};
};
};
config = mkIf config.webcam-rtsp.enable {
systemd.services.webcam-rtsp-publisher = {
description = "Publish USB webcam to MediaMTX over RTSP";
wantedBy = [ "multi-user.target" ];
after = [ "network-online.target" ];
wants = [ "network-online.target" ];
serviceConfig = {
Type = "simple";
Restart = "always";
RestartSec = "2";
ExecStart = ''
${pkgs.ffmpeg}/bin/ffmpeg \
-hide_banner -loglevel warning \
-f v4l2 -framerate ${toString config.webcam-rtsp.framerate} -video_size ${config.webcam-rtsp.videoSize} \
-i ${config.webcam-rtsp.device} \
-vcodec libx264 -tune zerolatency -preset veryfast \
-f rtsp ${config.webcam-rtsp.rtspUrl}
'';
};
};
};
}