{ me, ... }: let ffmpegDevice = device: format: resolution: hz: options: "ffmpeg:device?video=${device}&input_format=${format}&video_size=${resolution}&framerate=${hz}${options}"; go2rtcPort = 1984; webrtcPort = 8555; in { services.go2rtc = { enable = true; settings = { api = { listen = "${me.tailscale.ip}:${toString go2rtcPort}"; base_path = "/webcam"; origin = "*"; # stop cors annoyance! }; webrtc = let address = "${me.tailscale.ip}:${toString webrtcPort}"; in { listen = address; candidates = [ address ]; }; streams = { cam1-yuyv422 = ffmpegDevice "/dev/video0" "yuyv422" "1280x960" "30" "#video=h264#hardware"; # todo: i think ffmpeg still currently reencodes the mjpeg again, # but with video=copy all i get back are corrupted frames. cam1-mjpeg = ffmpegDevice "/dev/video0" "mjpeg" "1280x960" "30" ""; }; }; }; foundation.tailnetServices = [ "go2rtc" ]; }