|
| 1 | +# |
| 2 | +# nixos/hp/hp1/ffmpeg_systemd_service.nix |
| 3 | +# |
| 4 | +# systemctl --user restart ffmpeg-stream |
| 5 | +# systemctl --user status ffmpeg-stream |
| 6 | +# |
| 7 | +# [das@hp1:~/nixos/hp/hp1]$ systemctl --user restart ffmpeg-stream |
| 8 | + |
| 9 | +# [das@hp1:~/nixos/hp/hp1]$ systemctl --user status ffmpeg-stream |
| 10 | +# ● ffmpeg-stream.service |
| 11 | +# Loaded: loaded (/home/das/.config/systemd/user/ffmpeg-stream.service; enabled; preset: ignored) |
| 12 | +# Active: active (running) since Sun 2025-02-02 15:16:54 PST; 3min 41s ago |
| 13 | +# Invocation: ac9c5b7820cd40fe85f95d610a184c46 |
| 14 | +# Main PID: 394915 (ffmpeg) |
| 15 | +# Tasks: 37 (limit: 37129) |
| 16 | +# Memory: 230.4M (peak: 230.9M) |
| 17 | +# CPU: 2min 13.669s |
| 18 | +# CGroup: /user.slice/user-1000.slice/[email protected]/app.slice/ffmpeg-stream.service |
| 19 | +# └─394915 /nix/store/hk1a30i7a4nhc16sc407z0fi1yxgfgjp-ffmpeg-7.1-bin/bin/ffmpeg -f lavfi -re -i testsrc2=rate=30:size=1920x1080 -codec:v libx264 -b:v 10240k -maxrate:v 10000k -bu> |
| 20 | + |
| 21 | +# [das@hp1:~/nixos/hp/hp1]$ journalctl --user -u ffmpeg-stream -f |
| 22 | +# Feb 02 15:16:54 hp1 ffmpeg[394915]: [libx264 @ 0x352394c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2 |
| 23 | +# Feb 02 15:16:54 hp1 ffmpeg[394915]: [libx264 @ 0x352394c0] profile Constrained Baseline, level 4.0, 4:2:0, 8-bit |
| 24 | +# Feb 02 15:16:54 hp1 ffmpeg[394915]: Output #0, mpegts, to 'udp://239.0.0.1:6000?ttl=4&pkt_size=1326&localddr=172.16.40.142': |
| 25 | +# Feb 02 15:16:54 hp1 ffmpeg[394915]: Metadata: |
| 26 | +# Feb 02 15:16:54 hp1 ffmpeg[394915]: encoder : Lavf61.7.100 |
| 27 | +# Feb 02 15:16:54 hp1 ffmpeg[394915]: Stream #0:0: Video: h264, yuv420p(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 10240 kb/s, 25 fps, 90k tbn |
| 28 | +# Feb 02 15:16:54 hp1 ffmpeg[394915]: Metadata: |
| 29 | +# Feb 02 15:16:54 hp1 ffmpeg[394915]: encoder : Lavc61.19.100 libx264 |
| 30 | +# Feb 02 15:16:54 hp1 ffmpeg[394915]: Side data: |
| 31 | +# Feb 02 15:16:54 hp1 ffmpeg[394915]: cpb: bitrate max/min/avg: 10000000/0/10240000 buffer size: 10240000 vbv_delay: N/A |
| 32 | + |
| 33 | +# [das@hp1:~/nixos/hp/hp1]$ sudo tcpdump -ni eno1 -c 5 host 239.0.0.1 |
| 34 | +# tcpdump: verbose output suppressed, use -v[v]... for full protocol decode |
| 35 | +# listening on eno1, link-type EN10MB (Ethernet), snapshot length 262144 bytes |
| 36 | +# 15:21:39.577834 IP 172.16.40.142.4032 > 239.0.0.1.6000: UDP, length 1326 |
| 37 | +# 15:21:39.577866 IP 172.16.40.142.4032 > 239.0.0.1.6000: UDP, length 1326 |
| 38 | +# 15:21:39.577885 IP 172.16.40.142.4032 > 239.0.0.1.6000: UDP, length 1326 |
| 39 | +# 15:21:39.577907 IP 172.16.40.142.4032 > 239.0.0.1.6000: UDP, length 1326 |
| 40 | +# 15:21:39.577927 IP 172.16.40.142.4032 > 239.0.0.1.6000: UDP, length 1326 |
| 41 | +# 5 packets captured |
| 42 | +# 35 packets received by filter |
| 43 | +# 0 packets dropped by kernel |
| 44 | + |
| 45 | +{ |
| 46 | + config, |
| 47 | + lib, |
| 48 | + pkgs, |
| 49 | + ... |
| 50 | +}: |
| 51 | + |
| 52 | +# ${pkgs.ffmpeg}/bin/ffmpeg \ |
| 53 | +# ${home.packages.ffmpeg-full}/bin/ffmpeg \ |
| 54 | +# ffmpeg -f lavfi -i "sine=frequency=1000:duration=10" -c:a aac -b:a 128k /home/das/test_audio.aac |
| 55 | +let |
| 56 | + ffmpegCmd = |
| 57 | + '' |
| 58 | + ${pkgs.ffmpeg-full}/bin/ffmpeg -f lavfi -re -i testsrc2=rate=30:size=1920x1080 \ |
| 59 | + -f lavfi -i "sine=frequency=1000" \ |
| 60 | + -c:v libx264 -b:v 10000k -preset ultrafast -r 25 \ |
| 61 | + -x264-params "nal-hrd=cbr:force-cfr=1:aud=1:intra-refresh=1" \ |
| 62 | + -tune zerolatency \ |
| 63 | + -bsf:v h264_mp4toannexb \ |
| 64 | + -c:a aac -b:a 128k -ac 2 \ |
| 65 | + -max_delay 500000 -bufsize 2000000 -fflags +genpts \ |
| 66 | + -f rtp_mpegts "rtp://239.0.0.2:6000?pkt_size=1326&ttl=4&localaddr=172.16.40.142" |
| 67 | + ''; |
| 68 | + # Ensures SPS/PPS is sent in every keyframe (prevents decoder from losing parameter sets). |
| 69 | + # Forces constant frame rate (force-cfr=1), improving stream stability. |
| 70 | + |
| 71 | + # '' |
| 72 | + # ${pkgs.ffmpeg-full}/bin/ffmpeg \ |
| 73 | + # -f lavfi -re -i testsrc2=rate=30:size=1920x1080 \ |
| 74 | + # -f lavfi -i "sine=frequency=1000" \ |
| 75 | + # -c:v libx264 -b:v 10000k -preset ultrafast -r 25 \ |
| 76 | + # -c:a aac -b:a 128k -ac 2 \ |
| 77 | + # -x264opts "keyint=50:min-keyint=50:no-scenecut" \ |
| 78 | + # -bsf:v h264_mp4toannexb \ |
| 79 | + # -max_delay 500000 -bufsize 2000000 -fflags +genpts \ |
| 80 | + # -f rtp_mpegts "rtp://239.0.0.1:6000?pkt_size=1326&ttl=4&localaddr=172.16.40.142" |
| 81 | + # ''; |
| 82 | + #-x264opts "keyint=50:min-keyint=50:no-scenecut" ensures regular keyframes. |
| 83 | + #-bsf:v h264_mp4toannexb converts H.264 to Annex B format, which is better for streaming. |
| 84 | + |
| 85 | + # '' |
| 86 | + # ${pkgs.ffmpeg-full}/bin/ffmpeg \ |
| 87 | + # -f lavfi -re -i testsrc2=rate=30:size=1920x1080 \ |
| 88 | + # -f lavfi -i "sine=frequency=1000" \ |
| 89 | + # -c:v libx264 -b:v 10000k -preset ultrafast -r 25 \ |
| 90 | + # -c:a aac -b:a 128k -ac 2 \ |
| 91 | + # -max_delay 500000 -bufsize 2000000 -fflags +genpts \ |
| 92 | + # -f rtp_mpegts \ |
| 93 | + # "rtp://239.0.0.1:6000?pkt_size=1326&ttl=4&localaddr=172.16.40.142" |
| 94 | + # ''; |
| 95 | + |
| 96 | + # '' |
| 97 | + # ${pkgs.ffmpeg-full}/bin/ffmpeg \ |
| 98 | + # -f lavfi -re -i testsrc2=rate=30:size=1920x1080 \ |
| 99 | + # -re -i /home/das/test_audio/test_audio.aac \ |
| 100 | + # -c:v libx264 -b:v 10240k -maxrate:v 10000k -bufsize:v 10240k -preset ultrafast -r 25 -g 50 -pix_fmt yuv420p -flags2 local_header \ |
| 101 | + # -c:a aac -b:a 128k -ac 2 \ |
| 102 | + # -max_delay 500000 -bufsize 2000000 -fflags +genpts \ |
| 103 | + # -f rtp_mpegts \ |
| 104 | + # "rtp://239.0.0.1:6000?ttl=4&pkt_size=1326&localaddr=172.16.40.142" |
| 105 | + # ''; |
| 106 | + # '' |
| 107 | + # ${pkgs.ffmpeg}/bin/ffmpeg \ |
| 108 | + # -f lavfi \ |
| 109 | + # -re \ |
| 110 | + # -i testsrc2=rate=30:size=1920x1080 \ |
| 111 | + # -codec:v libx264 \ |
| 112 | + # -b:v 10240k \ |
| 113 | + # -maxrate:v 10000k \ |
| 114 | + # -bufsize:v 10240k \ |
| 115 | + # -preset ultrafast \ |
| 116 | + # -r 25 \ |
| 117 | + # -g 50 \ |
| 118 | + # -pix_fmt yuv420p \ |
| 119 | + # -flags2 local_header \ |
| 120 | + # -f mpegts \ |
| 121 | + # -transtype live \ |
| 122 | + # "rtp://239.0.0.1:6000?ttl=4&pkt_size=1326&localddr=172.16.40.142" |
| 123 | + # ''; |
| 124 | +in |
| 125 | +{ |
| 126 | + # sudo systemctl status ffmpeg-stream.service |
| 127 | + # sudo journalctl -u ffmpeg-stream.service |
| 128 | + # cat /etc/systemd/system/ffmpeg-stream.service |
| 129 | + systemd.services.ffmpeg-stream = { |
| 130 | + |
| 131 | + description = "FFmpeg Multicast Service"; |
| 132 | + after = [ "network.target" ]; |
| 133 | + |
| 134 | + serviceConfig = { |
| 135 | + ExecStart = "${ffmpegCmd}"; |
| 136 | + Restart = "always"; |
| 137 | + RestartSec = 10; |
| 138 | + StandardOutput = "journal"; |
| 139 | + StandardError = "journal"; |
| 140 | + |
| 141 | + # https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html#Scheduling |
| 142 | + Nice = "-20"; |
| 143 | + #CPUSchedulingPriority = "99"; |
| 144 | + |
| 145 | + ### 🔐 Security Hardening Options ### |
| 146 | + NoNewPrivileges = true; # Prevents privilege escalation |
| 147 | + PrivateTmp = true; # Isolates service temporary files |
| 148 | + ProtectSystem = "full"; # Restricts access to system files |
| 149 | + #ProtectSystem = "strict"; # Restricts access to system files |
| 150 | + #ProtectHome = "read-only"; # Readonly access to home directory |
| 151 | + ProtectHome = "yes"; # Blocks access to home directory |
| 152 | + ProtectKernelModules = true; # Blocks module loading |
| 153 | + ProtectKernelLogs = true; # Prevents access to kernel logs |
| 154 | + ProtectControlGroups = true; # Restricts cgroup modifications |
| 155 | + MemoryDenyWriteExecute = true; # Prevents memory exploits |
| 156 | + RestrictRealtime = true; # Blocks real-time priority settings |
| 157 | + RestrictAddressFamilies = [ "AF_INET" "AF_INET6" ]; # Restricts network access |
| 158 | + SystemCallFilter = [ "~@mount" "~@privileged" "~@resources" ]; # Blocks dangerous system calls |
| 159 | + LockPersonality = true; # Prevents personality changes (defense against exploits) |
| 160 | + ReadOnlyPaths = "/usr"; # Makes important paths read-only |
| 161 | + #ReadOnlyPaths = "/etc /usr /home/das/test_audio/"; # Makes important paths read-only |
| 162 | + #wReadWritePaths = "/var/www/html"; # Only allow writing in this directory |
| 163 | + ProtectClock = true; # Blocks modification of system clock |
| 164 | + }; |
| 165 | + |
| 166 | + # # systemctl list-units --type target |
| 167 | + # Install = { |
| 168 | + # after = [ "network.target" ]; |
| 169 | + # #WantedBy = [ "default.target" ]; |
| 170 | + # }; |
| 171 | + }; |
| 172 | +} |
0 commit comments