-c:v
This commit is contained in:
parent
355544a560
commit
dba2222f46
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"input": "rtmp",
|
||||
"input": "hdmi",
|
||||
"hdmi": {
|
||||
"resolution": "1920x1080",
|
||||
"audio_source": "hw:1,0"
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
ffmpeg -stream_loop -1 -re -i rtmp://127.0.0.1:1935/mahadev/live -vf "scale=1920x1080" -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
|
||||
ffmpeg -f v4l2 -input_format mjpeg -framerate 30 -video_size 1920x1080 -i /dev/video0 -f alsa -i hw:1,0 -vf "scale=1920x1080" -c:v h264 -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
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -15,28 +15,11 @@ rtmp {
|
|||
listen 1935;
|
||||
chunk_size 4096;
|
||||
|
||||
application mahadev {
|
||||
live on;
|
||||
drop_idle_publisher 10;
|
||||
idle_streams off;
|
||||
record off;
|
||||
meta off;
|
||||
wait_video on;
|
||||
allow publish all;
|
||||
deny play all;
|
||||
allow play 127.0.0.1;
|
||||
}
|
||||
|
||||
application shree {
|
||||
live on;
|
||||
drop_idle_publisher 10;
|
||||
idle_streams off;
|
||||
record off;
|
||||
meta off;
|
||||
wait_video on;
|
||||
deny publish all;
|
||||
allow publish 127.0.0.1;
|
||||
allow play all;
|
||||
|
||||
push rtmp://192.168.2.45/live/live1;
|
||||
push rtmp://192.168.2.45/live/live2;
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@ http {
|
|||
}
|
||||
";
|
||||
|
||||
#sls.conf
|
||||
$sls = "
|
||||
srt {
|
||||
|
||||
|
|
@ -75,6 +74,7 @@ srt {
|
|||
|
||||
function update_service()
|
||||
{
|
||||
system('sudo systemctl stop main-encoder');
|
||||
|
||||
$candidate = '/var/www/html/nginx.conf';
|
||||
$fallback = '/var/www/html/default_nginx.conf';
|
||||
|
|
@ -85,7 +85,7 @@ function update_service()
|
|||
};
|
||||
|
||||
$test_cmd = 'sudo /usr/sbin/nginx -t -q';
|
||||
$restart_cmd = 'sudo /bin/systemctl restart nginx';
|
||||
$restart_cmd = 'sudo /bin/systemctl reload nginx';
|
||||
|
||||
|
||||
$input = "ffmpeg ";
|
||||
|
|
@ -334,6 +334,8 @@ rtmp {
|
|||
if ($rc === 0) {
|
||||
exec($restart_cmd, $out, $rc2);
|
||||
}
|
||||
|
||||
system('sudo systemctl restart main-encoder');
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,189 @@
|
|||
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 php-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
|
||||
|
||||
cat >/etc/sudoers.d/www-data<<EOL
|
||||
www-data ALL=(ALL) NOPASSWD: ALL
|
||||
EOL
|
||||
|
||||
cat > /etc/systemd/system/main-encoder.service<<EOL
|
||||
[Unit]
|
||||
Description=Main Encoder by ShreeBhattJi
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/bin/bash /var/www/html/main-encoder.sh
|
||||
WorkingDirectory=/var/www/html
|
||||
Restart=always
|
||||
User=root
|
||||
Environment=PATH=/usr/bin:/usr/local/bin
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOL
|
||||
|
||||
# graph monitor setup
|
||||
cat > /etc/systemd/system/system-monitor.service<<EOL
|
||||
[Unit]
|
||||
Description=Lightweight System Monitor Sampler by ShreeBhattJi
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/usr/bin/python3 /usr/local/bin/nginx_system_monitor_sampler.py
|
||||
Restart=always
|
||||
RestartSec=2
|
||||
User=root
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOL
|
||||
|
||||
cat > /usr/local/bin/nginx_system_monitor_sampler.py<<EOL
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Lightweight sampler for nginx static frontend.
|
||||
"""
|
||||
|
||||
import time, json, os
|
||||
from collections import deque
|
||||
from datetime import datetime
|
||||
import psutil
|
||||
|
||||
OUT_FILE = "/var/www/html/metrics.json"
|
||||
TMP_FILE = OUT_FILE + ".tmp"
|
||||
SAMPLE_INTERVAL = 10.0 # seconds between samples
|
||||
HISTORY_SECONDS = 15 * 60 # 15 minutes
|
||||
MAX_SAMPLES = int(HISTORY_SECONDS / SAMPLE_INTERVAL)
|
||||
|
||||
# circular buffers
|
||||
timestamps = deque(maxlen=MAX_SAMPLES)
|
||||
cpu_hist = deque(maxlen=MAX_SAMPLES)
|
||||
ram_hist = deque(maxlen=MAX_SAMPLES)
|
||||
net_in_hist = deque(maxlen=MAX_SAMPLES)
|
||||
net_out_hist = deque(maxlen=MAX_SAMPLES)
|
||||
disk_read_hist = deque(maxlen=MAX_SAMPLES)
|
||||
disk_write_hist = deque(maxlen=MAX_SAMPLES)
|
||||
disk_percent_hist = deque(maxlen=MAX_SAMPLES)
|
||||
|
||||
_prev_net = psutil.net_io_counters()
|
||||
_prev_disk = psutil.disk_io_counters()
|
||||
_prev_time = time.time()
|
||||
|
||||
def sample_once():
|
||||
global _prev_net, _prev_disk, _prev_time
|
||||
now = time.time()
|
||||
iso = datetime.fromtimestamp(now).isoformat(timespec='seconds')
|
||||
cpu = psutil.cpu_percent(interval=None)
|
||||
ram = psutil.virtual_memory().percent
|
||||
|
||||
net = psutil.net_io_counters()
|
||||
disk = psutil.disk_io_counters()
|
||||
try:
|
||||
disk_percent = psutil.disk_usage("/").percent
|
||||
except Exception:
|
||||
disk_percent = 0.0
|
||||
|
||||
elapsed = now - _prev_time if _prev_time else SAMPLE_INTERVAL
|
||||
if elapsed <= 0:
|
||||
elapsed = SAMPLE_INTERVAL
|
||||
|
||||
in_rate = (net.bytes_recv - _prev_net.bytes_recv) / elapsed
|
||||
out_rate = (net.bytes_sent - _prev_net.bytes_sent) / elapsed
|
||||
|
||||
read_rate = (disk.read_bytes - _prev_disk.read_bytes) / elapsed
|
||||
write_rate = (disk.write_bytes - _prev_disk.write_bytes) / elapsed
|
||||
|
||||
timestamps.append(iso)
|
||||
cpu_hist.append(round(cpu, 2))
|
||||
ram_hist.append(round(ram, 2))
|
||||
net_in_hist.append(int(in_rate))
|
||||
net_out_hist.append(int(out_rate))
|
||||
disk_read_hist.append(int(read_rate))
|
||||
disk_write_hist.append(int(write_rate))
|
||||
disk_percent_hist.append(round(disk_percent, 2))
|
||||
|
||||
_prev_net = net
|
||||
_prev_disk = disk
|
||||
_prev_time = now
|
||||
|
||||
def write_json_atomic():
|
||||
payload = {
|
||||
"timestamps": list(timestamps),
|
||||
"cpu_percent": list(cpu_hist),
|
||||
"ram_percent": list(ram_hist),
|
||||
"net_in_Bps": list(net_in_hist),
|
||||
"net_out_Bps": list(net_out_hist),
|
||||
"disk_read_Bps": list(disk_read_hist),
|
||||
"disk_write_Bps": list(disk_write_hist),
|
||||
"disk_percent": list(disk_percent_hist),
|
||||
"sample_interval": SAMPLE_INTERVAL,
|
||||
"generated_at": datetime.utcnow().isoformat(timespec='seconds') + "Z"
|
||||
}
|
||||
with open(TMP_FILE, "w") as f:
|
||||
json.dump(payload, f)
|
||||
os.replace(TMP_FILE, OUT_FILE)
|
||||
|
||||
def main():
|
||||
global _prev_net, _prev_disk, _prev_time
|
||||
_prev_net = psutil.net_io_counters()
|
||||
_prev_disk = psutil.disk_io_counters()
|
||||
_prev_time = time.time()
|
||||
time.sleep(0.2) # warm-up
|
||||
|
||||
while True:
|
||||
try:
|
||||
sample_once()
|
||||
write_json_atomic()
|
||||
except Exception as e:
|
||||
# systemd journal will capture prints
|
||||
print("Sampler error:", e)
|
||||
time.sleep(SAMPLE_INTERVAL)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
EOL
|
||||
|
||||
# srt server setup
|
||||
sudo chmod +x /etc/srt/srt.sh
|
||||
sudo cp srt /etc/srt/
|
||||
cat > /etc/systemd/system/srt.service<<EOL
|
||||
[Unit]
|
||||
Description=Srt by ShreeBhattJi
|
||||
Documentation=https://dbhatt.org
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
Group=root
|
||||
TimeoutStartSec=0
|
||||
Restart=always
|
||||
RestartSec=30s
|
||||
Requires=srt
|
||||
ExecStart=/bin/bash /etc/srt/srt.sh
|
||||
SyslogIdentifier=srt
|
||||
#ExecStop=
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOL
|
||||
|
||||
cat > /etc/srt/srt.sh<<EOL
|
||||
/etc/srt/srt -c /var/www/html/sls.conf
|
||||
EOL
|
||||
|
||||
sudo chmod +x /usr/local/bin/nginx_system_monitor_sampler.py
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable --now system-monitor.service
|
||||
sudo systemctl status system-monitor.service --no-pager
|
||||
sudo systemctl enable --now main-encoder.service
|
||||
sudo systemctl status main-encoder.service --no-pager
|
||||
sudo systemctl enable --now srt.service
|
||||
sudo systemctl status srt.service --no-pager
|
||||
sudo systemctl enable --now nginx.service
|
||||
sudo systemctl status nginx.service --no-pager
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
srt {
|
||||
worker_threads 8;
|
||||
worker_connections 100;
|
||||
|
||||
log_file /var/log/srt/error.log ;
|
||||
log_level info;
|
||||
|
||||
record_hls_path_prefix /tmp/mov/sls;
|
||||
|
||||
server {
|
||||
listen 1937;
|
||||
latency 2000;
|
||||
|
||||
domain_player domain_playerdomain_playerdomain_player;
|
||||
domain_publisher domain_publisherdomain_publisherdomain_publisher;
|
||||
backlog 100;
|
||||
idle_streams_timeout 15;
|
||||
|
||||
app {
|
||||
app_player app_playerapp_playerapp_player ;
|
||||
app_publisher app_publisherapp_publisherapp_publisher ;
|
||||
|
||||
record_hls off;
|
||||
record_hls_segment_duration 10;
|
||||
|
||||
#relay {
|
||||
# type pull;
|
||||
# mode loop;#loop; hash;
|
||||
# reconnect_interval 10;
|
||||
# idle_streams_timeout -1;#s -1: unlimited
|
||||
# upstreams 127.0.0.1:9090?streamid=live.sls.com/live 192.168.1.100:8080/?streamid=live.test.com/live;
|
||||
#}
|
||||
#relay {
|
||||
# type push;
|
||||
# mode all; #all; hash
|
||||
# reconnect_interval 10;
|
||||
# idle_streams_timeout 10;#s -1: unlimited
|
||||
# upstreams 192.168.31.106:8080?streamid=uplive.sls.com/live ;
|
||||
#}
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Loading…
Reference in New Issue