From 31a39899182c8b9d4a14d84fe38cd0e38fa036b5 Mon Sep 17 00:00:00 2001 From: ShreeBhattJi Date: Thu, 20 Nov 2025 23:52:00 +0000 Subject: [PATCH] apache2 update --- html/default_nginx.conf => default_nginx.conf | 0 encoder-main.sh | 1 + encoder-rtmp.sh | 1 + {html => encoder}/about_us.php | 0 ...b6679b8d8815a2ec8e5524407f1b25d6eb1c46.php | 0 {html => encoder}/chart.js | 0 {html => encoder}/contact_us.php | 0 {html => encoder}/domain.php | 0 {html => encoder}/firmware.php | 0 {html => encoder}/footer.php | 0 {html => encoder}/header.php | 0 {html => encoder}/index.php | 4 + encoder/input.json | 22 ++ {html => encoder}/input.php | 6 +- encoder/metrics.json | 1 + {html => encoder}/network.php | 0 {html => encoder}/nginx.conf | 0 encoder/output.json | 140 +++++++ {html => encoder}/output.php | 52 ++- {html => encoder}/premium_service.php | 0 {html => encoder}/request_cert.php | 0 encoder/static.php | 357 ++++++++++++++++++ {html => encoder}/status.php | 0 html/firewall.php | 117 ------ html/main-encoder.sh | 1 - html/metrics.json | 1 + html/static.php | 209 +++++----- install.sh | 40 +- nginx.conf | 56 +++ 29 files changed, 773 insertions(+), 235 deletions(-) rename html/default_nginx.conf => default_nginx.conf (100%) create mode 100644 encoder-main.sh create mode 100755 encoder-rtmp.sh rename {html => encoder}/about_us.php (100%) rename {html => encoder}/ac4d5de9f5785044565fe1fd9578413738e9b7c9c4df6fd4dae247d8d2828c4e2a490b9edb0d6c84f5a1b6679b8d8815a2ec8e5524407f1b25d6eb1c46.php (100%) mode change 100644 => 100755 rename {html => encoder}/chart.js (100%) rename {html => encoder}/contact_us.php (100%) rename {html => encoder}/domain.php (100%) mode change 100644 => 100755 rename {html => encoder}/firmware.php (100%) rename {html => encoder}/footer.php (100%) rename {html => encoder}/header.php (100%) rename {html => encoder}/index.php (98%) create mode 100755 encoder/input.json rename {html => encoder}/input.php (98%) create mode 100755 encoder/metrics.json rename {html => encoder}/network.php (100%) rename {html => encoder}/nginx.conf (100%) create mode 100755 encoder/output.json rename {html => encoder}/output.php (91%) rename {html => encoder}/premium_service.php (100%) mode change 100644 => 100755 rename {html => encoder}/request_cert.php (100%) mode change 100644 => 100755 create mode 100755 encoder/static.php rename {html => encoder}/status.php (100%) mode change 100644 => 100755 delete mode 100755 html/firewall.php delete mode 100755 html/main-encoder.sh create mode 100644 html/metrics.json mode change 100755 => 100644 html/static.php create mode 100644 nginx.conf diff --git a/html/default_nginx.conf b/default_nginx.conf similarity index 100% rename from html/default_nginx.conf rename to default_nginx.conf diff --git a/encoder-main.sh b/encoder-main.sh new file mode 100644 index 0000000..0bee079 --- /dev/null +++ b/encoder-main.sh @@ -0,0 +1 @@ +ffmpeg -thread_queue_size 512 -f v4l2 -input_format mjpeg -framerate 30 -video_size 1920x1080 -i /dev/video0 -f alsa -i hw:0,0 -init_hw_device qsv=hw:/dev/dri/renderD128 -filter_hw_device hw -fflags +genpts -use_wallclock_as_timestamps 1 -vf "format=nv12,hwupload=extra_hw_frames=64,format=qsv" -c:v h264_qsv -b:v 3.3M -maxrate 3.3M -bufsize 10M -g 25 -af "aresample=async=1:first_pts=0" -c:a aac -ar 48000 -b:a 96k -vsync 1 -copytb 1 -f mpegts udp://239.255.255.254:39000?localaddr=127.0.0.1 \ No newline at end of file diff --git a/encoder-rtmp.sh b/encoder-rtmp.sh new file mode 100755 index 0000000..2b51309 --- /dev/null +++ b/encoder-rtmp.sh @@ -0,0 +1 @@ +ffmpeg -fflags nobuffer -i "udp://239.255.255.254:39000?localaddr=127.0.0.1&fifo_size=5000000&overrun_nonfatal=1" -c:v copy -c:a aac -f flv rtmp://127.0.0.1:1935/shree/bhattji \ No newline at end of file diff --git a/html/about_us.php b/encoder/about_us.php similarity index 100% rename from html/about_us.php rename to encoder/about_us.php diff --git a/html/ac4d5de9f5785044565fe1fd9578413738e9b7c9c4df6fd4dae247d8d2828c4e2a490b9edb0d6c84f5a1b6679b8d8815a2ec8e5524407f1b25d6eb1c46.php b/encoder/ac4d5de9f5785044565fe1fd9578413738e9b7c9c4df6fd4dae247d8d2828c4e2a490b9edb0d6c84f5a1b6679b8d8815a2ec8e5524407f1b25d6eb1c46.php old mode 100644 new mode 100755 similarity index 100% rename from html/ac4d5de9f5785044565fe1fd9578413738e9b7c9c4df6fd4dae247d8d2828c4e2a490b9edb0d6c84f5a1b6679b8d8815a2ec8e5524407f1b25d6eb1c46.php rename to encoder/ac4d5de9f5785044565fe1fd9578413738e9b7c9c4df6fd4dae247d8d2828c4e2a490b9edb0d6c84f5a1b6679b8d8815a2ec8e5524407f1b25d6eb1c46.php diff --git a/html/chart.js b/encoder/chart.js similarity index 100% rename from html/chart.js rename to encoder/chart.js diff --git a/html/contact_us.php b/encoder/contact_us.php similarity index 100% rename from html/contact_us.php rename to encoder/contact_us.php diff --git a/html/domain.php b/encoder/domain.php old mode 100644 new mode 100755 similarity index 100% rename from html/domain.php rename to encoder/domain.php diff --git a/html/firmware.php b/encoder/firmware.php similarity index 100% rename from html/firmware.php rename to encoder/firmware.php diff --git a/html/footer.php b/encoder/footer.php similarity index 100% rename from html/footer.php rename to encoder/footer.php diff --git a/html/header.php b/encoder/header.php similarity index 100% rename from html/header.php rename to encoder/header.php diff --git a/html/index.php b/encoder/index.php similarity index 98% rename from html/index.php rename to encoder/index.php index 0825a2e..80c1dad 100755 --- a/html/index.php +++ b/encoder/index.php @@ -25,6 +25,10 @@
CPU: % · RAM: % · In: KB/s · Out: KB/s
+
+
+
+
'; + die(); + } + + switch ($input_source) { + case "hdmi": + $input = "ffmpeg -thread_queue_size 512 -f v4l2 -input_format mjpeg -framerate " . $data['hdmi']['framerate'] . " -video_size " . $data['hdmi']['resolution'] . " -i /dev/video0 " . + "-f alsa -i " . $data['hdmi']['audio_source'] . ' -init_hw_device qsv=hw:/dev/dri/renderD128 -filter_hw_device hw -fflags +genpts -use_wallclock_as_timestamps 1 -vf "format=nv12,hwupload=extra_hw_frames=64,format=qsv" -c:v h264_qsv'; + break; + case "url": + $input .= "ffmpeg -hwaccel auto -stream_loop -1 -re -i " . $data['url']; + break; + case "rtmp": + $input .= "ffmpeg -hwaccel auto -stream_loop -1 -re -i rtmp://127.0.0.1:" . $$input_rtmp_port . "/" . $$input_rtmp_mount . "/" . $input_rtmp_pass; + break; + case "srt": + $input .= "-stream_loop -1 -re -i srt://127.0.0.1:" . $data['srt']['port'] . "/" . $data['srt']['stream_id_1'] . "/" . $data['srt']['stream_id_2'] . "/" . $data['srt']['stream_id_3']; + $input_port_srt = $data['srt']['port']; + break; + } + $input .= " "; + + $jsonFile = __DIR__ . '/output.json'; + + $defaults = [ + 'video' => [ + 'resolution' => '1920x1080', + 'format' => 'h264_qsv', + 'framerate' => '25', + 'data_rate' => '3.3M', + 'gop' => '12' + ], + 'audio' => [ + 'format' => 'aac', + 'sample_rate' => '48000', + 'bit_rate' => '96k', + 'db_gain' => '0dB' + ], + 'service_display' => 'disable', + 'output_display' => '1920x1080@60.00', + 'output_display_audio' => '0,3', + 'service_rtmp_multiple' => 'disable', + 'service_rtmp_hls' => 'disable', + 'service_rtmp_dash' => 'disable', + 'service_srt_multiple' => 'disable', + 'service_udp' => 'disable', + 'service_custom' => 'disable', + 'rtmp_multiple' => [], + 'srt_multiple' => [], + 'udp' => '', + 'custom_output' => '' + ]; + + for ($i = 1; $i <= 11; $i++) { + $defaults['rtmp_multiple'][$i] = ['url' => '', 'name' => '', 'enabled' => false]; + $defaults['srt_multiple'][$i] = ['url' => '', 'name' => '', 'enabled' => false]; + } + + if (file_exists($jsonFile)) { + $raw = file_get_contents($jsonFile); + $data = json_decode($raw, true); + if (!is_array($data)) $data = $defaults; + $data = array_replace_recursive($defaults, $data); + } else { + $data = $defaults; + } + + $service_display = $data['service_display']; + $service_rtmp_multiple = $data['service_rtmp_multiple']; + $service_rtmp_hls = $data['service_rtmp_hls']; + $service_rtmp_dash = $data['service_rtmp_dash']; + $service_srt_multiple = $data['service_srt_multiple']; + $service_udp = $data['service_udp']; + $service_custom = $data['service_custom']; + $rtmp_multiple = $data['rtmp_multiple']; + $srt_multiple = $data['srt_multiple']; + + $input .= ' -b:v ' . $data['video']['data_rate'] . ' -maxrate ' . $data['video']['data_rate'] . ' -bufsize 10M -g ' . $data['video']['gop'] . ' -af "aresample=async=1:first_pts=0" ' . + ' -c:a ' . $data['audio']['format'] . ' -ar ' . $data['audio']['sample_rate'] . ' -b:a ' . $data['audio']['bit_rate'] . ' -vsync 1 -copytb 1 -f mpegts udp://239.255.255.254:39000?localaddr=127.0.0.1'; + + $service = $input; + $file = "/var/www/encoder-main.sh"; + if (file_put_contents($file, $service) !== false) { + echo "File saved."; + } else { + echo "Error writing file."; + } + + switch ($which_service) { + case 'input': + exec('sudo systemctl restart encoder-main'); + break; + case 'display'; + break; + case 'rtmp'; + //if hls service enable add this to nginx + if ($service_rtmp_hls === "enable") { + $hls = " + hls on; + hls_path /var/www/html/hls/shree; + hls_fragment 3; + hls_playlist_length 60; +"; + } else { + $hls = " +"; + } + + //if dash service enable add this to nginx + if ($service_rtmp_dash === "enable") { + $dash = " + dash on; + dash_path /var/www/html/dash/shree; +"; + } else { + $dash = " +"; + } + + if (empty($input_rtmp_port)) + $input_rtmp_port = "1935"; + + $rtmp_push = ""; + + for ($i = 1; $i <= 11; $i++) { + if ($rtmp_multiple[$i]['enabled'] == 1) { + $rtmp_push .= " + push " . $rtmp_multiple[$i]['url'] . ";"; + } + } + + $nginx = $nginx_top; + if ($input_source === "rtmp") { + $nginx .= " +rtmp { + server { + listen " . $input_rtmp_port . "; + chunk_size 4096; + + application " . $input_rtmp_mount . " { + live on; + record off; + meta off; + wait_video on; + } + + application shree { + live on; + record off; + meta off; + wait_video on; + allow publish 127.0.0.1; + deny publish all; + " . $rtmp_push . " + } + } +} + "; + } else { + $nginx .= " +rtmp { + server { + listen 1935; + chunk_size 4096; + + application shree { + live on; + record off; + meta off; + wait_video on; + " . $rtmp_push . " + " . $hls . " + " . $dash . " + } + } +}"; + } + $nginx .= $nginx_bottom; + $file = "/var/www/nginx.conf"; + file_put_contents($file, $nginx); + + if ($service_rtmp_multiple === "enable") { + $rtmp = 'ffmpeg -fflags nobuffer -i "udp://239.255.255.254:39000?localaddr=127.0.0.1&fifo_size=5000000&overrun_nonfatal=1" -c:v copy -c:a aac -f flv rtmp://127.0.0.1:1935/shree/bhattji'; + $file = "/var/www/encoder-rtmp.sh"; + file_put_contents($file, $rtmp); + exec('sudo cp /var/www/nginx.conf /etc/nginx/'); + exec("$nginx -t 2>&1", $output, $status); + if ($status === 0) { + exec("sudo systemctl restart nginx 2>&1", $o, $s); + while (trim(shell_exec("systemctl is-active nginx")) !== "active") { + sleep(1); + } + exec("sudo systemctl enable encoder-rtmp"); + } else { + exec('sudo cp /var/www/nginx.conf /etc/nginx/'); + exec("sudo systemctl restart nginx"); + } + } { + } + + break; + case "srt"; + break; + case "udp"; + break; + case "custom"; + break; + default: + error_log("Error no input found"); + break; + } +} + + +function update_firewall() {} + +function update_network() {} + +function update_firmware() {} diff --git a/html/status.php b/encoder/status.php old mode 100644 new mode 100755 similarity index 100% rename from html/status.php rename to encoder/status.php diff --git a/html/firewall.php b/html/firewall.php deleted file mode 100755 index 3c8ed46..0000000 --- a/html/firewall.php +++ /dev/null @@ -1,117 +0,0 @@ - 'disable', - 'ips' => ['', '', '', '', ''] -]; - -// load existing data -if (file_exists($jsonFile)) { - $raw = file_get_contents($jsonFile); - $data = json_decode($raw, true); - if (!is_array($data)) $data = $defaults; -} else { - $data = $defaults; -} - -$errors = []; -$saveSuccess = ''; - -if ($_SERVER['REQUEST_METHOD'] === 'POST') { - // read posted values - $posted_firewall = isset($_POST['firewall']) && in_array($_POST['firewall'], ['enable', 'disable']) ? $_POST['firewall'] : 'disable'; - $posted_ips = []; - for ($i = 1; $i <= 5; $i++) { - $key = "ip{$i}"; - $val = isset($_POST[$key]) ? trim((string)$_POST[$key]) : ''; - $posted_ips[] = $val; - } - - // validate IPs (allow empty) - foreach ($posted_ips as $index => $ip) { - if ($ip !== '' && !filter_var($ip, FILTER_VALIDATE_IP)) { - $errors[] = "IP" . ($index + 1) . " is not a valid IP address: " . htmlspecialchars($ip); - } - } - - if (empty($errors)) { - $new = [ - 'firewall' => $posted_firewall, - 'ips' => $posted_ips - ]; - $json = json_encode($new, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); - if (file_put_contents($jsonFile, $json, LOCK_EX) === false) { - $errors[] = "Failed to write {$jsonFile}. Check permissions."; - } else { - $data = $new; - $saveSuccess = "Saved."; - } - } -} -?> - - -
-
-
-
-

Firewall

-
-
- > -
- - > -
-
-
-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
- -
- -
- -
-
-
-
-
-
- -'; - foreach ($errors as $e) echo '
' . $e . '
'; - echo ''; -} -if ($saveSuccess) { - echo '
' . htmlspecialchars($saveSuccess) . '
'; -} -?> - - \ No newline at end of file diff --git a/html/main-encoder.sh b/html/main-encoder.sh deleted file mode 100755 index 26a28ee..0000000 --- a/html/main-encoder.sh +++ /dev/null @@ -1 +0,0 @@ -ffmpeg -stream_loop -1 -re -i https://cdn.urmic.org/unavailable.mp4 -vf "scale=1920x1080" -c:v mpeg2video -b:v 3.3M -minrate 3.3M -maxrate 3.3M -bufsize 3.3M -g 12 -c:a aac -ar 48000 -b:a 96k -f flv rtmp://127.0.0.1:1935/shree/bhattji \ No newline at end of file diff --git a/html/metrics.json b/html/metrics.json new file mode 100644 index 0000000..cc0ddbd --- /dev/null +++ b/html/metrics.json @@ -0,0 +1 @@ +{"timestamps": ["2025-11-20T23:37:04", "2025-11-20T23:37:14", "2025-11-20T23:37:24", "2025-11-20T23:37:34", "2025-11-20T23:37:44", "2025-11-20T23:37:54", "2025-11-20T23:38:04", "2025-11-20T23:38:14", "2025-11-20T23:38:24", "2025-11-20T23:38:34", "2025-11-20T23:38:44", "2025-11-20T23:38:54", "2025-11-20T23:39:04", "2025-11-20T23:39:14", "2025-11-20T23:39:24", "2025-11-20T23:39:34", "2025-11-20T23:39:44", "2025-11-20T23:39:54", "2025-11-20T23:40:04", "2025-11-20T23:40:14", "2025-11-20T23:40:24", "2025-11-20T23:40:34", "2025-11-20T23:40:44", "2025-11-20T23:40:54", "2025-11-20T23:41:04", "2025-11-20T23:41:14", "2025-11-20T23:41:24", "2025-11-20T23:41:34", "2025-11-20T23:41:44", "2025-11-20T23:41:54", "2025-11-20T23:42:04", "2025-11-20T23:42:14", "2025-11-20T23:42:24", "2025-11-20T23:42:34", "2025-11-20T23:42:44", "2025-11-20T23:42:54", "2025-11-20T23:43:04", "2025-11-20T23:43:14", "2025-11-20T23:43:24", "2025-11-20T23:43:34", "2025-11-20T23:43:44", "2025-11-20T23:43:54", "2025-11-20T23:44:04", "2025-11-20T23:44:14", "2025-11-20T23:44:24", "2025-11-20T23:44:34", "2025-11-20T23:44:44", "2025-11-20T23:44:54", "2025-11-20T23:45:04", "2025-11-20T23:45:14", "2025-11-20T23:45:24", "2025-11-20T23:45:34", "2025-11-20T23:45:44", "2025-11-20T23:45:54", "2025-11-20T23:46:04", "2025-11-20T23:46:14", "2025-11-20T23:46:24", "2025-11-20T23:46:34", "2025-11-20T23:46:44", "2025-11-20T23:46:54", "2025-11-20T23:47:04", "2025-11-20T23:47:14", "2025-11-20T23:47:24", "2025-11-20T23:47:34", "2025-11-20T23:47:44", "2025-11-20T23:47:54", "2025-11-20T23:48:04", "2025-11-20T23:48:14", "2025-11-20T23:48:24", "2025-11-20T23:48:34", "2025-11-20T23:48:44", "2025-11-20T23:48:54", "2025-11-20T23:49:04", "2025-11-20T23:49:14", "2025-11-20T23:49:24", "2025-11-20T23:49:34", "2025-11-20T23:49:44", "2025-11-20T23:49:54", "2025-11-20T23:50:04", "2025-11-20T23:50:14", "2025-11-20T23:50:24", "2025-11-20T23:50:34", "2025-11-20T23:50:44", "2025-11-20T23:50:54", "2025-11-20T23:51:04", "2025-11-20T23:51:14", "2025-11-20T23:51:24", "2025-11-20T23:51:34", "2025-11-20T23:51:44", "2025-11-20T23:51:54"], "cpu_percent": [0.2, 0.3, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.3, 0.2, 0.5, 0.3, 0.1, 0.3, 0.2, 0.7, 0.8, 0.3, 0.3, 0.3, 1.1, 0.7, 0.7, 0.7, 0.4, 0.4, 0.9, 0.2, 0.6, 0.4, 0.5, 0.6, 1.1, 1.3, 0.7, 0.7, 0.6, 1.1, 0.8, 0.9, 1.3, 1.0, 0.6, 0.5, 0.5, 0.5, 0.4, 0.6, 0.8, 0.5, 0.5, 0.6, 0.5, 0.5, 0.5, 0.5, 0.6, 0.6, 0.5, 0.6, 0.5, 0.5, 1.0, 0.8, 0.7, 0.5, 0.2, 0.2, 1.2, 0.5, 1.1, 1.2, 1.1, 0.5, 0.6, 0.4, 0.7, 1.6, 1.5, 2.0, 1.4, 1.8, 0.6, 1.5, 0.9, 0.9, 1.5, 1.6], "ram_percent": [27.6, 27.6, 27.6, 27.6, 27.6, 27.6, 27.6, 27.6, 27.6, 27.6, 27.7, 27.7, 27.7, 27.6, 27.6, 27.6, 27.6, 27.6, 27.6, 27.6, 27.6, 27.6, 27.6, 27.6, 27.6, 27.7, 27.7, 27.7, 27.7, 27.7, 27.6, 27.6, 27.7, 27.6, 27.5, 28.0, 28.0, 28.0, 28.0, 28.0, 28.0, 27.9, 27.9, 28.0, 27.9, 27.9, 28.0, 28.0, 28.0, 28.1, 28.0, 28.0, 28.0, 28.0, 28.0, 28.0, 28.1, 28.0, 28.0, 28.0, 27.9, 28.0, 28.0, 27.9, 28.0, 28.0, 28.0, 28.0, 28.0, 28.0, 27.9, 28.0, 27.9, 28.0, 28.0, 28.1, 28.1, 28.1, 28.1, 28.2, 28.1, 27.6, 27.7, 27.7, 27.7, 27.7, 27.7, 27.8, 27.8, 27.8], "net_in_Bps": [3433, 9168, 3833, 3894, 3763, 3753, 3804, 3628, 3638, 3587, 3945, 4150, 3689, 3759, 3488, 3778, 3334, 23378, 36890, 16260, 25091, 14906, 41830, 25710, 26799, 22774, 30779, 37466, 36354, 3305, 23096, 28252, 46440, 18537, 36414, 34099, 44743, 39371, 22725, 52368, 37174, 36573, 59973, 30439, 27145, 14199, 12283, 11743, 12203, 12715, 12439, 12258, 14318, 12032, 12251, 12199, 12170, 12109, 12363, 14244, 12348, 12131, 14887, 18633, 72127, 39361, 20820, 24064, 4418, 4880, 37087, 18424, 32640, 37945, 38628, 15076, 45281, 38404, 26112, 97670, 24627, 78338, 47319, 50201, 15571, 50761, 24364, 28275, 23164, 35047], "net_out_Bps": [3105, 5282, 3069, 2910, 3096, 3193, 3244, 2957, 2854, 2803, 2803, 3110, 2859, 3092, 2621, 2706, 2453, 83490, 39855, 37339, 24384, 18605, 46444, 28179, 29038, 26476, 30061, 37205, 36046, 2690, 25391, 29143, 47331, 20787, 42094, 39388, 46924, 39382, 23389, 53754, 38209, 39693, 63161, 34129, 28767, 15844, 13941, 13563, 13693, 14231, 14262, 14030, 15754, 13751, 13834, 13760, 13757, 14017, 14041, 15594, 13943, 14020, 16594, 20435, 71734, 44023, 82658, 24119, 3834, 4126, 41386, 19735, 34317, 40857, 40994, 16555, 48715, 37855, 29426, 76152, 26319, 82622, 48198, 53958, 17069, 54064, 25800, 29508, 24782, 38900], "disk_read_Bps": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10235, 0, 0, 1637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2047, 3684, 409, 0, 409, 0, 0, 0, 0, 0, 0], "disk_write_Bps": [9826, 42169, 11463, 9825, 41760, 10235, 9825, 37666, 7369, 6960, 41760, 6550, 6550, 59774, 9826, 6550, 36847, 12691, 113817, 11873, 37256, 7369, 47899, 11463, 6960, 49129, 6550, 11054, 45445, 6960, 53633, 50358, 10644, 7369, 38485, 25383, 9416, 39303, 7778, 29887, 40941, 18014, 45444, 45035, 9007, 6960, 41758, 9825, 17604, 48720, 7369, 9416, 13510, 37666, 6960, 41760, 11871, 7369, 8188, 38075, 9007, 7778, 37256, 13510, 19651, 51175, 67143, 8188, 37666, 6550, 9416, 37256, 6959, 27020, 38074, 7369, 16785, 46672, 70418, 22108, 39303, 8597, 23745, 44215, 11054, 11054, 52814, 7369, 8188, 45034], "disk_percent": [7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2, 7.2], "sample_interval": 10.0, "generated_at": "2025-11-20T23:51:54Z"} \ No newline at end of file diff --git a/html/static.php b/html/static.php old mode 100755 new mode 100644 index 2c18d06..f4439a7 --- a/html/static.php +++ b/html/static.php @@ -72,11 +72,9 @@ srt { } "; -function update_service() +function update_service($which_service) { - shell_exec("sudo /bin/systemctl stop main-encoder"); - $candidate = '/var/www/html/nginx.conf'; $fallback = '/var/www/html/default_nginx.conf'; $target = '/etc/nginx/nginx.conf'; @@ -110,16 +108,18 @@ function update_service() ], 'url' => 'https://cdn.urmic.org/unavailable.mp4', 'rtmp' => [ - 'mount' => '', + 'mount' => 'channel_name', 'password' => 'live', 'port' => '1935' ], 'srt' => [ 'stream_id_1' => 'har', 'stream_id_2' => 'har', - 'stream_id_3' => 'Mahadev', + 'stream_id_3' => 'mahadev', 'port' => '1937' - ] + ], + 'udp' => 'udp://@224.1.1.1:8000', + 'custom' => '' ]; $jsonFile = __DIR__ . '/input.json'; @@ -146,10 +146,10 @@ function update_service() "-f alsa -i " . $data['hdmi']['audio_source'] . ' -init_hw_device qsv=hw:/dev/dri/renderD128 -filter_hw_device hw -fflags +genpts -use_wallclock_as_timestamps 1 -vf "format=nv12,hwupload=extra_hw_frames=64,format=qsv" -c:v h264_qsv'; break; case "url": - $input .= "ffmpeg -stream_loop -1 -re -i " . $data['url']; + $input .= "ffmpeg -hwaccel auto -stream_loop -1 -re -i " . $data['url']; break; case "rtmp": - $input .= "-stream_loop -1 -re -i rtmp://127.0.0.1:" . $data['rtmp']['port'] . "/" . $data['rtmp']['mount'] . "/" . $data['rtmp']['password']; + $input .= "ffmpeg -hwaccel auto -stream_loop -1 -re -i rtmp://127.0.0.1:" . $$input_rtmp_port . "/" . $$input_rtmp_mount . "/" . $input_rtmp_pass; break; case "srt": $input .= "-stream_loop -1 -re -i srt://127.0.0.1:" . $data['srt']['port'] . "/" . $data['srt']['stream_id_1'] . "/" . $data['srt']['stream_id_2'] . "/" . $data['srt']['stream_id_3']; @@ -160,28 +160,32 @@ function update_service() $jsonFile = __DIR__ . '/output.json'; - // default structure $defaults = [ - 'output' => 'display', 'video' => [ 'resolution' => '1920x1080', - 'format' => 'h264_h264', - 'data_rate' => '4M', + 'format' => 'h264_qsv', + 'framerate' => '25', + 'data_rate' => '3.3M', 'gop' => '12' ], 'audio' => [ 'format' => 'aac', 'sample_rate' => '48000', - 'bit_rate' => '96k' + 'bit_rate' => '96k', + 'db_gain' => '0dB' ], + 'service_display' => 'disable', 'output_display' => '1920x1080@60.00', 'output_display_audio' => '0,3', - 'rtmp_single' => '', - 'srt_single' => '', + 'service_rtmp_multiple' => 'disable', + 'service_rtmp_hls' => 'disable', + 'service_rtmp_dash' => 'disable', + 'service_srt_multiple' => 'disable', + 'service_udp' => 'disable', + 'service_custom' => 'disable', 'rtmp_multiple' => [], 'srt_multiple' => [], - 'udp_primary' => '', - 'udp_vlan' => '', + 'udp' => '', 'custom_output' => '' ]; @@ -199,72 +203,73 @@ function update_service() $data = $defaults; } + $service_display = $data['service_display']; + $service_rtmp_multiple = $data['service_rtmp_multiple']; + $service_rtmp_hls = $data['service_rtmp_hls']; + $service_rtmp_dash = $data['service_rtmp_dash']; + $service_srt_multiple = $data['service_srt_multiple']; + $service_udp = $data['service_udp']; + $service_custom = $data['service_custom']; $rtmp_multiple = $data['rtmp_multiple']; $srt_multiple = $data['srt_multiple']; - $input .= ' -b:v ' . $data['video']['data_rate'] . ' -maxrate ' . $data['video']['data_rate'] . ' -bufsize 10M -g ' . $data['video']['gop'] .' -af "aresample=async=1:first_pts=0" '. + $input .= ' -b:v ' . $data['video']['data_rate'] . ' -maxrate ' . $data['video']['data_rate'] . ' -bufsize 10M -g ' . $data['video']['gop'] . ' -af "aresample=async=1:first_pts=0" ' . ' -c:a ' . $data['audio']['format'] . ' -ar ' . $data['audio']['sample_rate'] . ' -b:a ' . $data['audio']['bit_rate'] . ' -vsync 1 -copytb 1 -f mpegts udp://239.255.255.254:39000?localaddr=127.0.0.1'; $service = $input; - $file = "/var/www/main-encoder.sh"; + $file = "/var/www/encoder-main.sh"; if (file_put_contents($file, $service) !== false) { echo "File saved."; } else { echo "Error writing file."; } + switch ($which_service) { + case 'input': + exec('sudo systemctl restart encoder-main'); + break; + case 'display'; + break; + case 'rtmp'; + //if hls service enable add this to nginx + if ($service_rtmp_hls === "enable") { + $hls = " + hls on; + hls_path /var/www/html/hls/shree; + hls_fragment 3; + hls_playlist_length 60; +"; + } else { + $hls = " +"; + } - switch ($data['output']) { - case "display": - $output_display_audio = $data['output_display_audio']; - $input = "mpv --fs --loop --hwdec=auto --audio-device=alsa/plughw:" . $output_display_audio . " udp://239.255.255.254:39000"; - break; - case "rtmp_single": - $input .= '-vf "scale=' . $data['video']['resolution'] . '" -c:v ' . $data['video']['format'] . ' -b:v ' . $data['video']['data_rate'] - . ' -minrate ' . $data['video']['data_rate'] . ' -maxrate ' . $data['video']['data_rate'] . ' -bufsize ' . $data['video']['data_rate'] . ' -g ' . $data['video']['gop'] . - ' -c:a ' . $data['audio']['format'] . ' -ar ' . $data['audio']['sample_rate'] . ' -b:a ' . $data['audio']['bit_rate'] . ' -f flv ' . $data['rtmp_single']; - break; - case "srt_single": - $input .= '-vf "scale=' . $data['video']['resolution'] . '" -c:v ' . $data['video']['format'] . ' -b:v ' . $data['video']['data_rate'] . ' -minrate ' . $data['video']['data_rate'] . ' -maxrate ' . $data['video']['data_rate'] . ' -bufsize ' . $data['video']['data_rate'] . ' -g ' . $data['video']['gop'] . - ' -c:a ' . $data['audio']['format'] . ' -ar ' . $data['audio']['sample_rate'] . ' -b:a ' . $data['audio']['bit_rate'] . ' -f mpegts ' . $data['srt_single']; - break; - case "rtmp_multiple": - $input .= '-vf "scale=' . $data['video']['resolution'] . '" -c:v ' . $data['video']['format'] . ' -b:v ' . $data['video']['data_rate'] - . ' -minrate ' . $data['video']['data_rate'] . ' -maxrate ' . $data['video']['data_rate'] . ' -bufsize ' . $data['video']['data_rate'] . ' -g ' . $data['video']['gop'] . - ' -c:a ' . $data['audio']['format'] . ' -ar ' . $data['audio']['sample_rate'] . ' -b:a ' . $data['audio']['bit_rate'] . ' -f flv rtmp://127.0.0.1:' - . $input_rtmp_port . '/shree/bhattji'; - break; - case "srt_multiple": - if (empty($input_port)) - $input_port = "1937"; - $input .= '-vf "scale=' . $data['video']['resolution'] . '" -c:v ' . $data['video']['format'] . ' -b:v ' . $data['video']['data_rate'] - . ' -minrate ' . $data['video']['data_rate'] . ' -maxrate ' . $data['video']['data_rate'] . ' -bufsize ' . $data['video']['data_rate'] . ' -g ' . $data['video']['gop'] . - ' -c:a ' . $data['audio']['format'] . ' -ar ' . $data['audio']['sample_rate'] . ' -b:a ' . $data['audio']['bit_rate'] . ' -f mpegts srt://127.0.0.1:' - . $input_port . '/shree/bhatt/ji'; - break; - case "udp_primary": - break; - case "udp_vlan": - break; - case "custom_output": - break; - } + //if dash service enable add this to nginx + if ($service_rtmp_dash === "enable") { + $dash = " + dash on; + dash_path /var/www/html/dash/shree; +"; + } else { + $dash = " +"; + } - if (empty($input_rtmp_port)) - $input_rtmp_port = "1935"; + if (empty($input_rtmp_port)) + $input_rtmp_port = "1935"; - $rtmp_push = ""; + $rtmp_push = ""; - for ($i = 1; $i <= 11; $i++) { - if ($rtmp_multiple[$i]['enabled'] == 1) { - $rtmp_push .= " + for ($i = 1; $i <= 11; $i++) { + if ($rtmp_multiple[$i]['enabled'] == 1) { + $rtmp_push .= " push " . $rtmp_multiple[$i]['url'] . ";"; - } - } + } + } - $nginx = $nginx_top; - if ($input_source === "rtmp") { - $nginx .= " + $nginx = $nginx_top; + if ($input_source === "rtmp") { + $nginx .= " rtmp { server { listen " . $input_rtmp_port . "; @@ -282,15 +287,15 @@ rtmp { record off; meta off; wait_video on; - " . - $rtmp_push - . " + allow publish 127.0.0.1; + deny publish all; + " . $rtmp_push . " } } } "; - } else { - $nginx .= " + } else { + $nginx .= " rtmp { server { listen 1935; @@ -301,39 +306,47 @@ rtmp { record off; meta off; wait_video on; - " . - $rtmp_push - . " + " . $rtmp_push . " + " . $hls . " + " . $dash . " } } -} - "; - } - $nginx .= $nginx_bottom; - $file = "/var/www/html/nginx.conf"; - if (file_put_contents($file, $nginx) !== false) { - echo "File saved."; - } else { - echo "Error writing file."; - } +}"; + } + $nginx .= $nginx_bottom; + $file = "/var/www/nginx.conf"; + file_put_contents($file, $nginx); - exec($cp_cmd($candidate, $target), $out, $rc); - // if nginx config test OK, restart and exit - exec($test_cmd, $out, $rc); - if ($rc === 0) { - exec($restart_cmd, $out, $rc2); - return; - } + if ($service_rtmp_multiple === "enable") { + $rtmp = 'ffmpeg -fflags nobuffer -i "udp://239.255.255.254:39000?localaddr=127.0.0.1&fifo_size=5000000&overrun_nonfatal=1" -c:v copy -c:a aac -f flv rtmp://127.0.0.1:1935/shree/bhattji'; + $file = "/var/www/encoder-rtmp.sh"; + file_put_contents($file, $rtmp); + exec('sudo cp /var/www/nginx.conf /etc/nginx/'); + exec("$nginx -t 2>&1", $output, $status); + if ($status === 0) { + // Config OK → restart nginx + exec("sudo systemctl restart nginx"); + exec("sudo systemctl reset-failed encoder-rtmp.service"); + exec("sudo systemctl restart encoder-rtmp"); + } else { + exec('sudo cp /var/www/nginx.conf /etc/nginx/'); + exec("sudo systemctl restart nginx"); + exec("sudo systemctl stop encoder-rtmp"); + } + } { + } - // fallback copy - exec($cp_cmd($fallback, $target), $out, $rc); - exec($test_cmd, $out, $rc); - if ($rc === 0) { - exec($restart_cmd, $out, $rc2); + break; + case "srt"; + break; + case "udp"; + break; + case "custom"; + break; + default: + error_log("Error no input found"); + break; } - - sleep(10); - shell_exec("sudo /bin/systemctl restart main-encoder"); } diff --git a/install.sh b/install.sh index 9a634a4..4d99d1a 100755 --- a/install.sh +++ b/install.sh @@ -1,6 +1,6 @@ sudo mkdir /etc/srt; sudo apt update -sudo apt install -y vainfo intel-media-va-driver-non-free i965-va-driver-shaders ffmpeg nginx v4l-utils python3-pip php8.3-fpm mpv libnginx-mod-rtmp alsa-utils vlan git zlib1g-dev +sudo apt install -y vainfo intel-media-va-driver-non-free i965-va-driver libmfx1 certbot intel-gpu-tools python3-certbot-nginx ffmpeg nginx v4l-utils python3-pip php8.3-fpm mpv libnginx-mod-rtmp alsa-utils vlan git zlib1g-dev sudo pip3 install psutil --break-system-packages dpkg -i srt-1.5.5-Linux.deb @@ -9,14 +9,33 @@ cat >/etc/sudoers.d/www-data< /etc/systemd/system/main-encoder.service< /etc/systemd/system/encoder-main.service< /etc/systemd/system/encoder-rtmp.service<