From 47d9e203f3e8fdbe5fddbc521061abff1c861678 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Fri, 10 Jan 2025 22:54:32 -0500 Subject: [PATCH] Add media role. --- nix/configuration/configuration.nix | 1 + nix/configuration/hosts/odo/default.nix | 3 + nix/configuration/roles/media/default.nix | 74 ++++++ .../roles/media/files/cast_file_nvidia | 11 + .../roles/media/files/cast_file_vaapi | 237 ++++++++++++++++++ nix/configuration/roles/media/files/mpv.conf | 25 ++ 6 files changed, 351 insertions(+) create mode 100644 nix/configuration/roles/media/default.nix create mode 100644 nix/configuration/roles/media/files/cast_file_nvidia create mode 100644 nix/configuration/roles/media/files/cast_file_vaapi create mode 100644 nix/configuration/roles/media/files/mpv.conf diff --git a/nix/configuration/configuration.nix b/nix/configuration/configuration.nix index 57a1d03..99d2535 100644 --- a/nix/configuration/configuration.nix +++ b/nix/configuration/configuration.nix @@ -42,6 +42,7 @@ ./roles/docker ./roles/kubernetes ./roles/rust + ./roles/media ]; nix.settings.experimental-features = [ diff --git a/nix/configuration/hosts/odo/default.nix b/nix/configuration/hosts/odo/default.nix index 4543931..2519e96 100644 --- a/nix/configuration/hosts/odo/default.nix +++ b/nix/configuration/hosts/odo/default.nix @@ -27,4 +27,7 @@ environment.systemPackages = with pkgs; [ fw-ectool ]; + + me.graphical = true; + me.graphicsCardType = "amd"; } diff --git a/nix/configuration/roles/media/default.nix b/nix/configuration/roles/media/default.nix new file mode 100644 index 0000000..f258b61 --- /dev/null +++ b/nix/configuration/roles/media/default.nix @@ -0,0 +1,74 @@ +{ + config, + lib, + pkgs, + ... +}: +let + cast_file_vaapi = + (pkgs.writeScriptBin "cast_file" (builtins.readFile ./files/cast_file_vaapi)).overrideAttrs + (old: { + buildCommand = "${old.buildCommand}\n patchShebangs $out"; + + }); + cast_file_nvidia = + (pkgs.writeScriptBin "cast_file" (builtins.readFile ./files/cast_file_nvidia)).overrideAttrs + (old: { + buildCommand = "${old.buildCommand}\n patchShebangs $out"; + + }); +in +{ + imports = [ ]; + + options.me.graphicsCardType = lib.mkOption { + type = lib.types.nullOr ( + lib.types.enum [ + "amd" + "intel" + "nvidia" + ] + ); + default = null; + example = "amd"; + description = "What graphics card type is in the computer."; + }; + + options.me.graphical = lib.mkOption { + type = lib.types.bool; + default = false; + example = true; + description = "Whether we want to install graphical programs."; + }; + + config = ( + lib.mkMerge [ + { + environment.systemPackages = with pkgs; [ + ffmpeg + ]; + + home-manager.users.talexander = + { pkgs, ... }: + { + home.file.".config/mpv/mpv.conf" = { + source = ./files/mpv.conf; + }; + }; + } + (lib.mkIf config.me.graphical { + environment.systemPackages = with pkgs; [ + mpv + evince + gimp + imv + ]; + }) + (lib.mkIf (config.me.graphicsCardType == "amd" || config.me.graphicsCardType == "intel") { + environment.systemPackages = with pkgs; [ + cast_file_vaapi + ]; + }) + ] + ); +} diff --git a/nix/configuration/roles/media/files/cast_file_nvidia b/nix/configuration/roles/media/files/cast_file_nvidia new file mode 100644 index 0000000..51d298d --- /dev/null +++ b/nix/configuration/roles/media/files/cast_file_nvidia @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# + +ffmpeg -re -i "$1" -vcodec h264_nvenc -r 30 -g 30 -loop -1 -c:a aac -b:a 160k -ar 44100 -strict -2 -f flv rtmp:172.16.16.44/live/test & +ffmpegpid=$! + +sleep 1 +castnow --exit 'https://broadcast.fizz.buzz/hls/hls/test.m3u8' +wait "$ffmpegpid" + +sleep 10 diff --git a/nix/configuration/roles/media/files/cast_file_vaapi b/nix/configuration/roles/media/files/cast_file_vaapi new file mode 100644 index 0000000..9c41665 --- /dev/null +++ b/nix/configuration/roles/media/files/cast_file_vaapi @@ -0,0 +1,237 @@ +#!/usr/bin/env bash +# +set -euo pipefail +IFS=$'\n\t' +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +: ${VIDEO_BITRATE:="1M"} # Only for encoding modes targeting bitrate +: ${AUDIO_BITRATE:="192k"} + +############## Setup ######################### + +function die { + local status_code="$1" + shift + (>&2 echo "${@}") + exit "$status_code" +} + +function log { + (>&2 echo "${@}") +} + +############## Program ######################### + +function main { + local cmd + cmd=$1 + shift + if [ "$cmd" = "copy" ]; then + copy "${@}" + elif [ "$cmd" = "convert" ]; then + convert "${@}" + elif [ "$cmd" = "stream" ]; then + stream "${@}" + elif [ "$cmd" = "webcam" ]; then + webcam "${@}" + elif [ "$cmd" = "encode_webcam" ]; then + encode_webcam "${@}" + else + (>&2 echo "Unknown command: $cmd") + exit 1 + fi +} + +function copy { + local file_to_cast + file_to_cast="$3" + + local USERNAME PASSWORD + USERNAME="$1" + PASSWORD="$2" + + set -x +