|
68 | 68 | # a=rtpmap:33 MP2T/90000 |
69 | 69 | # ''; |
70 | 70 |
|
| 71 | + # https://developer.nvidia.com/blog/nvidia-ffmpeg-transcoding-guide/#processing_filters |
71 | 72 | ffmpegCmd = '' |
72 | 73 | ${pkgs.ffmpeg-full}/bin/ffmpeg \ |
73 | | - -hwaccel cuda -hwaccel_output_format cuda \ |
| 74 | + -vsync 0 \ |
| 75 | + -hwaccel cuda \ |
| 76 | + -hwaccel_output_format cuda \ |
74 | 77 | -protocol_whitelist "file,udp,rtp" \ |
75 | 78 | -analyzeduration 200000000 \ |
76 | 79 | -probesize 150M \ |
77 | 80 | -fflags +genpts -max_delay 5000000 \ |
78 | 81 | -f mpegts \ |
79 | 82 | -i /hls/stream.sdp \ |
80 | | - -filter_complex "[0:v]hwupload_cuda,split=3[v10_in][v5_in][v1_in]; \ |
81 | | - [v10_in]scale_cuda=w=1920:h=1080,hwdownload,format=yuv420p[v10_scaled]; \ |
82 | | - [v5_in]scale_cuda=w=1280:h=720,hwdownload,format=yuv420p[v5_scaled]; \ |
83 | | - [v1_in]scale_cuda=w=640:h=360,hwdownload,format=yuv420p[v1_scaled]" \ |
84 | | - -map "[v10_scaled]" -map 0:a:0 -c:v h264_nvenc -pix_fmt nv12 -b:v 10M -bufsize 20M -preset p5 -g 50 -keyint_min 50 -c:a aac -b:a 128k -ac 2 \ |
85 | | - -f hls -hls_time 4 -hls_list_size 20 -hls_delete_threshold 2 \ |
86 | | - -hls_flags delete_segments+independent_segments+temp_file+discont_start+omit_endlist \ |
87 | | - -strftime 1 -hls_segment_filename "/hls/hls_10Mbps/stream-%Y%m%d%H%M%S.ts" \ |
88 | | - "/hls/hls_10Mbps/stream_10.m3u8" \ |
89 | | - -map "[v5_scaled]" -map 0:a:0 -c:v h264_nvenc -pix_fmt nv12 -b:v 5M -bufsize 10M -preset p5 -g 50 -keyint_min 50 -c:a aac -b:a 128k -ac 2 \ |
90 | | - -f hls -hls_time 4 -hls_list_size 20 -hls_delete_threshold 2 \ |
91 | | - -hls_flags delete_segments+independent_segments+temp_file+discont_start+omit_endlist \ |
92 | | - -strftime 1 -hls_segment_filename "/hls/hls_5Mbps/stream-%Y%m%d%H%M%S.ts" \ |
93 | | - "/hls/hls_5Mbps/stream_5.m3u8" \ |
94 | | - -map "[v1_scaled]" -map 0:a:0 -c:v h264_nvenc -pix_fmt nv12 -b:v 1M -bufsize 2M -preset p5 -g 50 -keyint_min 50 -c:a aac -b:a 128k -ac 2 \ |
95 | | - -f hls -hls_time 4 -hls_list_size 20 -hls_delete_threshold 2 \ |
96 | | - -hls_flags delete_segments+independent_segments+temp_file+discont_start+omit_endlist \ |
97 | | - -strftime 1 -hls_segment_filename "/hls/hls_1Mbps/stream-%Y%m%d%H%M%S.ts" \ |
98 | | - "/hls/hls_1Mbps/stream_1.m3u8" |
| 83 | + -filter_complex "[0:v]split=2[v2][v3]; \ |
| 84 | + [v2]scale_npp=1280:720:interp_algo=super[vout2]; \ |
| 85 | + [v3]scale_npp=640:360:interp_algo=super[vout3]" \ |
| 86 | + -map 0:v -c:v hevc_nvenc -b:v 10M -preset p1 -tune hq -rc cbr -maxrate 10M -bufsize 20M -g 50 -pix_fmt yuv420p \ |
| 87 | + -f hls -hls_time 4 -hls_list_size 20 -hls_delete_threshold 2 \ |
| 88 | + -hls_flags delete_segments+independent_segments+temp_file+discont_start+omit_endlist \ |
| 89 | + -strftime 1 -hls_segment_filename "/hls/hls_10Mbps/stream-%Y%m%d%H%M%S.ts" \ |
| 90 | + "/hls/hls_10Mbps/stream_10.m3u8" \ |
| 91 | + -map "[vout2]" -c:v hevc_nvenc -b:v 5M -preset p1 -tune hq -rc cbr -maxrate 5M -bufsize 10M -g 50 -pix_fmt yuv420p \ |
| 92 | + -f hls -hls_time 4 -hls_list_size 20 -hls_delete_threshold 2 \ |
| 93 | + -hls_flags delete_segments+independent_segments+temp_file+discont_start+omit_endlist \ |
| 94 | + -strftime 1 -hls_segment_filename "/hls/hls_5Mbps/stream-%Y%m%d%H%M%S.ts" \ |
| 95 | + "/hls/hls_5Mbps/stream_5.m3u8" \ |
| 96 | + -map "[vout3]" -c:v hevc_nvenc -b:v 1M -preset p1 -tune hq -rc cbr -maxrate 1M -bufsize 2M -g 50 -pix_fmt yuv420p \ |
| 97 | + -f hls -hls_time 4 -hls_list_size 20 -hls_delete_threshold 2 \ |
| 98 | + -hls_flags delete_segments+independent_segments+temp_file+discont_start+omit_endlist \ |
| 99 | + -strftime 1 -hls_segment_filename "/hls/hls_1Mbps/stream-%Y%m%d%H%M%S.ts" \ |
| 100 | + "/hls/hls_1Mbps/stream_1.m3u8" \ |
| 101 | + -map a:0 -c:a aac -b:a 128k -ac 2 -f hls -hls_time 4 -hls_list_size 20 \ |
| 102 | + -hls_segment_filename "/hls/audio/stream-%Y%m%d%H%M%S.ts" "/hls/audio/stream_audio.m3u8" \ |
| 103 | + -master_pl_name "/hls/master.m3u8" |
99 | 104 | ''; |
| 105 | + |
| 106 | + # ffmpegCmd = '' |
| 107 | + # ${pkgs.ffmpeg-full}/bin/ffmpeg \ |
| 108 | + # -vsync 0 \ |
| 109 | + # -hwaccel cuda -hwaccel_output_format cuda \ |
| 110 | + # -protocol_whitelist "file,udp,rtp" \ |
| 111 | + # -analyzeduration 200000000 \ |
| 112 | + # -probesize 150M \ |
| 113 | + # -fflags +genpts -max_delay 5000000 \ |
| 114 | + # -f mpegts \ |
| 115 | + # -i /hls/stream.sdp \ |
| 116 | + # -filter_complex "[0:v]hwupload_cuda,split=3[v10_in][v5_in][v1_in]; \ |
| 117 | + # [v10_in]scale_cuda=w=1920:h=1080,hwdownload,format=yuv420p[v10_scaled]; \ |
| 118 | + # [v5_in]scale_cuda=w=1280:h=720,hwdownload,format=yuv420p[v5_scaled]; \ |
| 119 | + # [v1_in]scale_cuda=w=640:h=360,hwdownload,format=yuv420p[v1_scaled]" \ |
| 120 | + # -map "[v10_scaled]" -map 0:a:0 -c:v h264_nvenc -pix_fmt nv12 -b:v 10M -bufsize 20M -preset p5 -g 50 -keyint_min 50 -c:a aac -b:a 128k -ac 2 \ |
| 121 | + # -f hls -hls_time 4 -hls_list_size 20 -hls_delete_threshold 2 \ |
| 122 | + # -hls_flags delete_segments+independent_segments+temp_file+discont_start+omit_endlist \ |
| 123 | + # -strftime 1 -hls_segment_filename "/hls/hls_10Mbps/stream-%Y%m%d%H%M%S.ts" \ |
| 124 | + # "/hls/hls_10Mbps/stream_10.m3u8" \ |
| 125 | + # -map "[v5_scaled]" -map 0:a:0 -c:v h264_nvenc -pix_fmt nv12 -b:v 5M -bufsize 10M -preset p5 -g 50 -keyint_min 50 -c:a aac -b:a 128k -ac 2 \ |
| 126 | + # -f hls -hls_time 4 -hls_list_size 20 -hls_delete_threshold 2 \ |
| 127 | + # -hls_flags delete_segments+independent_segments+temp_file+discont_start+omit_endlist \ |
| 128 | + # -strftime 1 -hls_segment_filename "/hls/hls_5Mbps/stream-%Y%m%d%H%M%S.ts" \ |
| 129 | + # "/hls/hls_5Mbps/stream_5.m3u8" \ |
| 130 | + # -map "[v1_scaled]" -map 0:a:0 -c:v h264_nvenc -pix_fmt nv12 -b:v 1M -bufsize 2M -preset p5 -g 50 -keyint_min 50 -c:a aac -b:a 128k -ac 2 \ |
| 131 | + # -f hls -hls_time 4 -hls_list_size 20 -hls_delete_threshold 2 \ |
| 132 | + # -hls_flags delete_segments+independent_segments+temp_file+discont_start+omit_endlist \ |
| 133 | + # -strftime 1 -hls_segment_filename "/hls/hls_1Mbps/stream-%Y%m%d%H%M%S.ts" \ |
| 134 | + # "/hls/hls_1Mbps/stream_1.m3u8 \ |
| 135 | + # -master_pl_name /hls/master.m3u8" |
| 136 | + # ''; |
100 | 137 | # -i "rtp://239.0.0.1:6000" \ |
101 | 138 | # -i /hls/stream.sdp \ |
102 | 139 | # -filter_complex "[0:v]split=3[v10][v5][v1]; \ |
|
120 | 157 | } |
121 | 158 | ]; |
122 | 159 |
|
| 160 | + # https://www.freedesktop.org/software/systemd/man/latest/tmpfiles.d.html |
123 | 161 | systemd.tmpfiles.rules = [ |
| 162 | + #Type Path Mode User Group Age Argument… |
124 | 163 | "d /hls 0770 nginx nginx -" |
125 | | - "d /hls/hls_10Mbps 0770 nginx nginx -" |
126 | | - "d /hls/hls_5Mbps 0770 nginx nginx -" |
127 | | - "d /hls/hls_1Mbps 0770 nginx nginx -" |
| 164 | + "d /hls/hls_10Mbps 0770 nginx nginx 5m" |
| 165 | + "d /hls/hls_5Mbps 0770 nginx nginx 5m" |
| 166 | + "d /hls/hls_1Mbps 0770 nginx nginx 5m" |
128 | 167 | ]; |
129 | 168 |
|
130 | 169 | # sudo systemctl restart create-stream-sdp.service |
|
178 | 217 | StandardError = "journal"; |
179 | 218 | LimitNOFILE = 1048576; |
180 | 219 |
|
| 220 | + # https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html#Scheduling |
| 221 | + Nice = "-20"; |
| 222 | + #CPUSchedulingPriority = "99"; |
| 223 | + # https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html/managing_monitoring_and_updating_the_kernel/assembly_configuring-cpu-affinity-and-numa-policies-using-systemd_managing-monitoring-and-updating-the-kernel#assembly_configuring-cpu-affinity-and-numa-policies-using-systemd_managing-monitoring-and-updating-the-kernel |
| 224 | + #CPUAffinity= |
| 225 | + #NUMAMask= |
| 226 | + |
181 | 227 | Environment = [ |
182 | 228 | "CUDA_PATH=${pkgs.linuxPackages.nvidia_x11}/lib" |
183 | 229 | "EXTRA_LDFLAGS=-L/lib -L${pkgs.linuxPackages.nvidia_x11}/lib" |
|
0 commit comments