'url',
'hdmi' => [
'resolution' => '1920x1080',
'audio_source' => 'hw:1,0'
],
'url' => 'https://cdn.urmic.org/unavailable.mp4',
'rtmp' => [
'mount' => '',
'password' => 'live',
'port' => '1935'
],
'srt' => [
'stream_id_1' => 'har',
'stream_id_2' => 'har',
'stream_id_3' => 'Mahadev',
'port' => '1937'
]
];
$jsonFile = __DIR__ . '/input.json';
if (file_exists($jsonFile)) {
$raw = file_get_contents($jsonFile);
$data = json_decode($raw, true);
if (!is_array($data)) $data = $defaults;
}
$input_source = $data['input'];
$input_rtmp_port = $data['rtmp']['port'];
$input_rtmp_mount = $data['rtmp']['mount'];
$input_rtmp_pass = $data['rtmp']['password'];
$input_port_srt = $data['srt']['port'];
if ($input_rtmp_port === "80" || $input_rtmp_port === "443" || $input_port_srt === "80" || $input_port_srt === "443") {
echo '';
die();
}
switch ($input_source) {
case "hdmi":
$input .= "-f v4l2 -input_format mjpeg -framerate 30 -video_size " . $data['hdmi']['resolution'] . " -i /dev/video0 -f alsa -i " . $data['hdmi']['audio_source'];
break;
case "url":
$input .= "-stream_loop -1 -re -i " . $data['url'];
$input_link = $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_link = "rtmp://127.0.0.1:" . $data['rtmp']['port'] . "/" . $data['rtmp']['mount'] . "/" . $data['rtmp']['password'];
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_link = "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';
// default structure
$defaults = [
'output' => 'display',
'video' => [
'resolution' => '1920x1080',
'format' => 'h264_h264',
'data_rate' => '4M',
'gop' => '12'
],
'audio' => [
'format' => 'aac',
'sample_rate' => '48000',
'bit_rate' => '96k'
],
'output_display' => '1920x1080@60.00',
'output_display_audio' => '0,3',
'rtmp_single' => '',
'srt_single' => '',
'rtmp_multiple' => [],
'srt_multiple' => [],
'udp_primary' => '',
'udp_vlan' => '',
'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;
}
$rtmp_multiple = $data['rtmp_multiple'];
$srt_multiple = $data['srt_multiple'];
$output = $data['output'];
switch ($data['output']) {
case "display":
if ($input_source === "hdmi") {
echo "";
} else {
$output_display_audio = $data['output_display_audio'];
$input = "mpv --fs --loop --hwdec=auto --audio-device=alsa/plughw:" . $output_display_audio . " " . $input_link;
}
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;
}
$service = $input;
$file = "/var/www/html/main-encoder.sh";
if (file_put_contents($file, $service) !== false) {
echo "File saved.";
} else {
echo "Error writing file.";
}
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;
" .
$rtmp_push
. "
}
}
}
";
} else {
$nginx .= "
rtmp {
server {
listen 1935;
chunk_size 4096;
application shree {
live on;
record off;
meta off;
wait_video on;
" .
$rtmp_push
. "
}
}
}
";
}
$nginx .= $nginx_bottom;
$file = "/var/www/html/nginx.conf";
if (file_put_contents($file, $nginx) !== false) {
echo "File saved.";
} else {
echo "Error writing file.";
}
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;
}
// fallback copy
exec($cp_cmd($fallback, $target), $out, $rc);
exec($test_cmd, $out, $rc);
if ($rc === 0) {
exec($restart_cmd, $out, $rc2);
}
system('sudo systemctl restart main-encoder');
}
function update_firewall() {}
function update_network() {}
function update_firmware() {}