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.";
- }
- }
-}
-?>
-
-
-
-
-';
- 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<