-- 17/10/2025 by jokel -- Beende das Skript, wenn kein Argument übergeben wurde if #arg < 1 then return nil end -- Sleep-Funktion (in Sekunden) function sleep(a) local sec = os.clock() + a while os.clock() < sec do end end -- Shell-Befehl ausführen und Ergebnis zurückgeben function pop(cmd) local f = assert(io.popen(cmd, 'r')) local s = assert(f:read('*a')) f:close() return s end -- JSON-Modul laden json = require "json" -- Eingabe-URL aus Argument übernehmen local _url = arg[1] -- Zufälligen Port im Bereich 49152–65535 wählen math.randomseed(os.time()) function is_port_free(port) local result = pop("fuser " .. port .. "/tcp 2>/dev/null") return result == "" end local function get_free_port() local port repeat port = math.random(49152, 65535) until is_port_free(port) return port end -- Freien Port holen local port = get_free_port() -- FFmpeg-Befehl vorbereiten local cmd = string.format( "ffmpeg -loglevel quiet -nostats -re -i '%s' -vcodec copy -acodec copy -f mpegts tcp://127.0.0.1:%d?listen &", _url, port ) -- FFmpeg starten os.execute(cmd) print("FFmpeg läuft auf Port: " .. port) -- Warten, bis Port aktiv ist (max. 5 Sekunden) for i = 1, 5 do local run = pop("fuser " .. port .. "/tcp 2>/dev/null") if #run ~= 0 then break end sleep(1) end -- Ergebnis-Objekt local entry = {} entry['url'] = "tcp://127.0.0.1:" .. port entry['band'] = "1" entry['res1'] = "1" entry['res2'] = "1" entry['name'] = _url .. " ffmpeg proxy" ret = {} ret[1] = entry return json:encode(ret)