Szerző: sysman

  • FFMPEG – IceCast2 környezet elindítása

    Ez a leírás újraindítja a PulseAudio hangrendszert a felhasználói környezetben. Hasznos akkor, ha a PulseAudio hibásan működik, nem lehet hozzá kapcsolódni, vagy új modult (pl. virtual sink) szeretnénk betölteni.

    Script: /home/mtm/pulseaudio-reboot.sh

    A szkript:

    1. Leállítja a PulseAudio-t.

    2. Törli a cache és konfigurációs fájlokat (~/.config/pulse és ~/.pulse).

    3. Beállítja az XDG_RUNTIME_DIR környezeti változót.

    4. Elindítja a PulseAudio-t újra.

    5. Betölti a module-null-sink modult VirtualSink néven.

    6. Beállítja a VirtualSink-et alapértelmezetként.

    7. Ha kéred, elindítja az FFMPEG – IceCast2 kapcsolatot

    A szkript megtalálható itt is: /home/mtm/html/mtm.project/systems/vlcbroadcast/sh

    Tesztelés, hibaelhárítás

    Közvetlenül PulseAudio teszt VirtualSink kimenetre

    paplay –device=VirtualSink /usr/share/sounds/alsa/Front_Center.wav

    Ha megszólal, ellőrizni kell, hogy PulseAudio Controll beállításai között a Default Sink értékét, melynek VirtualSink beállítást kell, hogy tartalmazza.

    pactl info

    Ha nem megfelelő a beállítás:

    pactl set-default-sink VirtualSink

    Ellenőrizzük, hogy megtörtént-e a beállítás.

    pactl info

    Ha megfelelő a beállítás, próbáld meg a Controll VLC-vel elindítani egy lejátszást!

    cvlc /home/mtm/html/mtm.project/ramdrive/temp/024.wav

    Ha megjelent a hang az IceCast2 szerveren, akkor lehet tesztelni az REST API – SOCKET párost.

  • 🎧 Audio Playback API – FastAPI + Socket alapú vezérlés

    Ez a projekt egy Python alapú REST API, amely lehetővé teszi hangfájlok lejátszását, vezérlését és állapotának lekérdezését egy socket-alapú lejátszómagon keresztül. A rendszer FastAPI-ra épül, és a háttérben egy socket szerveren keresztül kommunikál a lejátszó modulokkal.

    🧠 Működés röviden

    • A REST API parancsokat fogad HTTP-n keresztül (pl. /play, /stop, /volume).
    • Ezeket a parancsokat JSON formátumban továbbítja egy helyi socket szervernek (alapértelmezetten 127.0.0.1:9999).
    • A socket válaszként visszaküld egy JSON választ, amelyet az API továbbít a kliensnek.

    🚀 Telepítés

    1. Követelmények:
    pip install fastapi uvicorn
    1. API indítása:
    uvicorn api_server:app --host 127.0.0.1 --port 8010 --reload

    Feltételezi, hogy a fájl neve api_server.py.


    📡 API végpontok és használatuk

    🔊 POST /play

    Hangfájl lejátszása.

    Bemeneti JSON:

    {
      "file_path": "/path/to/audio.wav",
      "start_ms": 0,
      "volume": 100,
      "start_at": 1721981243.0
    }
    
    KulcsTípusAlapértelmezettLeírás
    file_pathstringA lejátszandó WAV fájl elérési útja
    start_msint0Hanyadik milliszekundumtól induljon a lejátsás
    volumeint100Kezdő hangerő 0–100 között
    start_atfloatNoneOpcionális abszolút Unix timestamp, mikor induljon

    Példa válasz:

    {
      "id": "thread_001",
      "status": "started"
    }

    ⏹️ POST /stop

    Lejátszás leállítása adott azonosító alapján.

    Bemeneti JSON:

    {
      "id": "thread_001"
    }
    KulcsTípusLeírás
    idstringA lejátszási szál azonosítója

    Példa válasz:

    {
      "status": "stopped",
      "id": "thread_001"
    }

    🔉 POST /volume

    Hangerő módosítása egy aktív lejátszási szálhoz.

    Bemeneti JSON:

    {
      "id": "thread_001",
      "volume": 80
    }
    KulcsTípusLeírás
    idstringA lejátszási szál azonosítója
    volumeintÚj hangerő érték 0–100 között

    Példa válasz:

    {
      "status": "volume_changed",
      "id": "thread_001",
      "volume": 80
    }

    📊 GET /status

    Jelenlegi rendszerállapot lekérdezése.

    Nincs bemenet.

    Példa válasz:

    {
      "active_threads": [
        {
          "id": "thread_001",
          "file_path": "/path/to/audio.wav",
          "position_ms": 23456,
          "volume": 80
        }
      ]
    }

    🧩 Modulok leírása

    • PlayRequest: lejátszási paramétereket tartalmaz (útvonal, időzítés, hangerő).
    • ControlRequest: szálazonosító alapján vezérlő parancsokat küld.
    • VolumeRequest: hangerő szabályozásához használt modell.
    • send_socket_command(): TCP socket kapcsolaton küldi a parancsokat a háttér lejátszó processznek.

    ⚠️ Hibakezelés

    Ha a socket kapcsolat sikertelen, az API 500 Internal Server Error válasszal tér vissza, a kivétel szöveges részletével a detail mezőben.


    📌 Megjegyzés

    A rendszer feltételezi, hogy egy külön háttérben futó socket szerver (lejátszó) elérhető a 127.0.0.1:9999 címen, amely értelmezi a "action" mezővel ellátott JSON parancsokat.


    🛠️ Fejlesztési lehetőségek

    • További vezérlők: PAUSE, RESUME, SEEK
    • Felhasználói autentikáció
    • Webes felület a REST API-hoz

  • SuperCollider: Supernova multi threading, több szerveres megoldás

    A supernova a SuperCollider egy speciális verziója, amely párhuzamosított (multithreaded) audio-motort használ. Ez azt jelenti, hogy több CPU magot tud kihasználni a hangszintézishez, így jobb teljesítményt érhetsz el nagyobb projektek esetén.

    Alapértelmezés szerint a scsynth csak egy CPU magot használ, míg a supernova lehetővé teszi a processzor több magjának egyidejű használatát.

    Server.supernova;
    s.options.threads = 8;

    Miért hasznos a supernova?

    Jobb teljesítmény nagyobb számú synth esetén
    Több CPU mag egyidejű kihasználása
    Kevesebb késleltetés (latency)
    Szálkezelés optimalizálása nagyobb projektekhez

    A supernova kifejezetten akkor hasznos, ha sok szintetizátort futtatsz egyszerre, és nem akarod, hogy az egyetlen processzormagod legyen a szűk keresztmetszet.

    Terminál-parancs: oscsend

    oscsend localhost 57121 /setFile ss "/mnt/ramdrive/temp/002.wav" "p1"
    oscsend localhost 57121 /play s "p1"
    oscsend localhost 57121 /stop sf "p1" 7.0
    oscsend localhost 57121 /stop fs 7.0 "p1"

    Terminál-parancs: supernova (SuperCollider) indítása

     ./startsc

    Terminál-parancs: JACK supernova indítása

    ./jacksn.sh {darkice id}

    Hasznos linkek:

    CPU headroom, multi threading

  • Broadcast Core manuális indítása és tesztelése

    A fejlesztés korai szakaszában a már működő SuperCollider – JACK – Darkice szolgáltatás-együttes indítása és tesztelése. Az indítási folyamat lépéseinek sorrendjét tartani kell. Amíg a SuperCollider nem bootolt be, addig a JACK nem tud hozzá csatlakozni. A JACK fogja a SuperCollider által lejátszott audio fájlt a Darkice-nak biztosítani.

    A Darkice szerver indítása nem szükséges, mert szolgáltatásként elindul a szerverrel együtt. Az mtm nevű felhasználóhoz kapcsolt szolgáltatás a megfelelő jogosultságokkal. A konfigurációs fájl is az mtm felhasználó home könyvtárában található. Az mtm felhasználó tudja is indítani a Darkice szolgáltatást.

    service darkice stat | stop | status

    Minden parancs az mtm felhasználónévvel bejelentkezve adható ki!

    1. SuperCollider indítása

    bash:
    sclang

    2. SuperCollider szerver bootolása

    supercollider:
    s.boot;

    3. JACK szolgáltatás indítása

    Mivel az SuperCollider nem lép ki promptba az sclang-ból, ezért ezt egy másik terminálablakban kell végrehajtani.

    A JACK szolgáltatáshoz ismerni kell a SuperCollider audio out csatornájának azonosítóját (portját). Ez viszont minden Darkice indításkor megváltozhat.

    A JACK indításához írt bash script paramétereként kell megadni az SC audio out csatorna azonosítóját, de ha nem ismered, akkor csak paraméterként indítsd el a bash scriptet, és a hibaüzenetek közt kiírja azt is, hogy milyen azonosítóval érhető el az out csatona.

    A parancsot az mtm felhasználó home könyvtárában kell kiadni.

    bash:
    ./jack.sh <audio out azonosítója>

    A SuperCollider innentől kell, hogy tudjon hangot kiadni az IceCast2 szerver felé. Ha tesztelésre van szükség, akkor az sclang-ban kiadható egy parancs, mely egy 440Hz-es hangot küld, 30%-os hangerővel, sztereó csatornán keresztül a JACK felé.

    supercollider:
    { SinOsc.ar(440, 0, 0.3).dup }.play;

    Böngészőben megnyitható a következő címen a stream:

    Web:
    http://192.168.66.12:8000/mtm.mp3

    Az sclang-ban megállítható a teszthang a következő parancsokkal:

    supercollider:
    s.freeAll;

    4. A SuperCollider script betöltése sclangban.

    supercollider:
    "/home/mtm/html/mtm.project/systems/broadcast/core/scd/scplay3.1.scd".load;

    5. OCS vezérlő betöltése – Node.JS script WebSocketServer

    A script könyvtára: /home/mtm/html/mtm.project/systems/broadcast/core/ocs

    Script: wss_osc.js

    Ennek indítása a előtt meg kell győződni arról, hogy a scriptben lévő portok megfelelően vannak beállítva. Az OSC parancsokat az SuperCollider egy meghatározott porton fogadja. Hogy melyik porton az lellenőrizhető az sclang-ban kiadott paranccsal:

    supercollider:
    NetAddr.langPort
    wss_osc.js
    remoteAddress: "127.0.0.1",
    remotePort: 57122 // SC alapértelmezett OSC portja

    A remotePort értéke egyenlő kell, hogy legyen az sclang-ban kapott értékkel.

    Ha rendben van a következő paranccsal indítható a wss_osc.js

    bash:
    pm2 start wss_osc.js --name osc-controller

    OSC WSS port: 8080

    Ebben a könyvtárban az ./start_osc.sh bash script is ezt a parancsot adja ki.

    6. OSC vezérlő tesztelése

    Ubuntu Server terminálablakából a wscat segítéségvel. A wscat alkalmas a WebSocket szerverkkel kommunikálni, így JSON objektumokat küldhetünk az OSC vezérlőnek úgy, ahogyan a SuperCollid script várja. A wscat a Node.JS része, így npm használatával telepíthető, ha még nem lenne elérhető. Érdemes globális telepítést indítani, hogy bármelyik virtuális környezetben elérhető legyen.

    Telepítése:

    bash:
    npm install -g wscat

    A -g opció jelenti a globális telepítést.

    A wscat indítása:

    bash:
    wscat -c ws://127.0.0.1:8080

    Példa a JSON objektumokban küldhető parancsokra:

    wscat:
    {"command": "setFile", "filePath": "/mnt/ramdrive/temp/001.wav", "bufferName": "p1"}
    {"command": "setFile", "filePath": "/mnt/ramdrive/temp/020.wav", "bufferName": "p2"}
    {"command": "setFile", "filePath": "/mnt/ramdrive/temp/018.wav", "bufferName": "p3"}
    {"command": "play", "bufferName": "p1"}
    {"command": "play", "bufferName": "p2"}
    {"command": "play", "bufferName": "p3"}
    {"command": "stop", "fadeTime": 2.0, "bufferName": "p1"}
    {"command": "stop", "fadeTime": 7.0, "bufferName": "p2"}
    {"command": "stop", "fadeTime": 7.0, "bufferName": "p3"}

  • Broadcast Core: SuperCollider és Node.js

    A broadcast vezérlés fő összetevői: SuperCollider server az audio fájlok lejátszásra; Node.js java script a SuperCollider vezérlésére OSC (Open Sound Control) használatával. Ezek a háttérben futnak szolgáltatásként, és a megadott portokon lehet elérni a szolgáltatásokat.

    A SuperCollider indításáról itt lehet olvasni bővebben.

    SuperCollider: scplay3.1.scd

    Az scplay rendszermag már a harmadik verzióban kerül továbbfejlesztésre. Több próbálkozás közül ez a verzió hozta meg a várt működést.

    A fájl helye:
    ./mtm.project/systems/broadcast/core/scd/scplay3.x.scd

    Indítása SuperCollider serveren

    s.boot;
    "/home/mtm/html/mtm.project/systems/broadcast/core/scd/scplay3.1.scd".load;

    Ha az OSC parancsokat szeretnénk az sclang környezetében használni, akkor meg kell nyitni egy portot, melyen keresztül kommunikálni tudunk a SuperCollider serverrel

    n = NetAddr("127.0.0.1", NetAddr.langPort);

    Bufferelés

    Az eredeti gondolat az volt, hogy 2 buffer kerül létrehozásra, melybe betöltető egy audio fájl (URL alapján) elindítható a lejátszás, dinamikus fade-out használatával meg lehet állítani a lejátszást.

    Az scplay 3. verziója több szálat is képes bufferelni, és a bufferek mindegyikét külön-külön tudja kezelni (lejátszani és megállítani) a buffer nevével, melyet a fájl betöltésénél kell megadni (lásd: setfile).

    A bufferek egy Dictionary típusú változóban kerülnek tárolására.

    ~buffers = Dictionary.new;

    A SuperCollider kód Dokumentáció

    Ez a SuperCollider szkript egy egyszerű OSC-vezérelt hanglejátszó rendszert valósít meg. A kód a SuperCollider szerveren fut, ahol az OSC (Open Sound Control) üzeneetek által kapott parancsokat hajtja végre. A szkript képes hanglefájlokat beolvasni, lejátszani, megállítani és figyelni a lejtátszási pozíciót.

    1. Globális Változók

    ~buffers = Dictionary.new;
    ~players = Dictionary.new;
    • ~buffers: Egy szótár („Dictionary”), amely a betöltött hangfájlokat Buffer objektumok formájában tárolja.
    • ~players: Egy szótár, amely a futó Synth objektumokat tárolja, amelyek a hangfájlokat lejátsszák.

    2. OSC Definíciók

    2.1. Hangfájl beállítása

    OSCdef(\setFile, { |msg|
        var bufferName;
    
        ~filePath = msg[1];
        bufferName = msg[2];
        "File set to: ".post; ~filePath.postln;
        ("Buffer: " + bufferName).postln;
        ~buffers[bufferName] = Buffer.read(s, ~filePath);
    }, '/setFile');
    • OSCdef(\setFile, { |msg| ... }, '/setFile');: Egy OSC hallgató, amely a /setFile üzeneetre reagál.
    • msg[1]: A beolvasandó hangfájl elérési útja.
    • msg[2]: A buffer neve, amely alatt a fájl elérhető lesz.
    • Buffer.read(s, ~filePath): A hangfájl betöltése a szerverre, majd a ~buffers szótárban elmentése.

    2.2. Hangfájl leátszása

    OSCdef(\play, { |msg|
        var bufferName;
        bufferName = msg[1];
    
        if (~filePath.notNil) {
            ~players[bufferName] = Synth(\playerSynth, [\buf, ~buffers[bufferName]]);
            "Playing file: ".post; ~filePath.postln;
            ("Playing buffer: " + bufferName).postln;
        } {
            "No file set!".postln;
        };
    }, '/play');
    • OSCdef(\play, { |msg| ... }, '/play');: Egy OSC hallgató, amely a /play üzenetre reagál.
    • msg[1]: A buffer neve, amelyet le kell játszani.
    • Synth(\playerSynth, [\buf, ~buffers[bufferName]]): Egy Synth példányt hoz létre, amely lejátssza a bufferName nevű bufferben lévő hangot.
    • ~players[bufferName]: A futó Synth példányt tárolja a megfelelő kulcs alatt.

    2.3. Lejátszás leállítása

    OSCdef(\stop, { |msg|
        var fadeTime = msg[1].asFloat;
        var bufferName = msg[2];
    
        fadeTime = fadeTime.max(0.1);
    
        if (~players[bufferName].notNil) {
            "Stopping " + bufferName + "] with fade-out: ".post; fadeTime.postln;
            ~players[bufferName].set(\gate, 0, \fadeTime, fadeTime);
            ~players[bufferName] = nil;
        } {
            ("No active player! [" + bufferName + "]").postln;
        };
    }, '/stop');
    • fadeTime = msg[1].asFloat: Az elhalvás ideje.
    • fadeTime = fadeTime.max(0.1): Biztosítja, hogy ne legyen 0 vagy negatív.
    • ~players[bufferName].set(\gate, 0, \fadeTime, fadeTime): Az envelope gate lezárásával elindít egy fade-out-ot.
    • ~players[bufferName] = nil;: A referencia törlése.

    3. Lejátszás definíciója (SynthDef)

    SynthDef(\playerSynth, {
        |buf, fadeTime = 1.0, gate = 1|
        var sig, env, pos, rate;
    
        rate = BufRateScale.kr(buf);
        env = EnvGen.kr(Env.asr(0.01, 1, fadeTime, curve: -4), gate, doneAction: 2);
        sig = PlayBuf.ar(2, buf, rate, loop: 0);
        
        pos = Phasor.ar(0, rate, 0, BufFrames.kr(buf));
        SendReply.kr(Impulse.kr(1), '/playbackPosition', pos / BufSampleRate.kr(buf));
        
        Out.ar(0, sig * env);
    }).add;
    • BufRateScale.kr(buf): A buffer sebességi arányának kiszámítása.
    • EnvGen.kr(...): Az envelope generálása a fade-out kezelésére.
    • PlayBuf.ar(...): A buffer lejátszása.
    • Phasor.ar(...): A lejátszási pozíció kiszámítása.
    • SendReply.kr(...): A lejtátszási időközön OSC üzenetet küld.
    • Out.ar(0, sig * env): A jel kiküldése a hangkimenetre.

    4. Lejátszási Pozíció Figyelése

    OSCdef(\positionListener, { |msg|
        var time, min, sec;
        time = msg[3].asInteger;
        min = time.div(60);
        sec = time.mod(60);
        ("Playback Position: " ++ min.asString ++ ":" ++ sec.asString).postln;
    }, '/playbackPosition');

    Ez az OSC hallgató figyeli a /playbackPosition üzeneetet, és formázottan kiírja az aktuális időpozíciót.

    Node.js OSC és WebSocket szerver dokumentáció

    A fájl helye:
    ./mtm.project/systems/broadcast/core/osc/wss_osc.js

    Áttekintés

    Ez a Node.js alkalmazás egy Open Sound Control (OSC) protokollt használó szerver, amely kommunikál egy SuperCollider (SC) szerverrel. Az alkalmazás egy WebSocket szervert is futtat, amely lehetővé teszi, hogy a kliensek valós időben küldjenek parancsokat és kapjanak visszajelzéseket a lejátszási pozícióról.

    Függőségek

    Az alkalmazás két fő Node.js modult használ:

    • osc: Az OSC protokoll kezeléséhez
    • ws: WebSocket kommunikációhoz

    A szükséges csomagok telepíthetők a következő paranccsal:

    npm install osc ws

    OSC Szerver Konfiguráció

    const osc = require('osc');

    Az osc modult importáljuk, hogy az OSC protokollal tudjunk kommunikálni.

    const udpPort = new osc.UDPPort({
        localAddress: "0.0.0.0",
        localPort: 57121, // Az SC által figyelt port
        remoteAddress: "127.0.0.1",
        remotePort: 57122 // SC alapértelmezett OSC portja
    });

    Létrehozunk egy UDP alapú OSC kapcsolatot:

    • localAddress: "0.0.0.0": A szerver minden hálózati interfészen figyel.
    • localPort: 57121: A helyi OSC szerver ezen a porton hallgat.
    • remoteAddress: "127.0.0.1": A cél SC szerver azonosítója (localhost).
    • remotePort: 57122: Az SC alapértelmezett OSC portja.
    udpPort.open();

    Megnyitjuk az OSC kapcsolatot.

    udpPort.on("ready", () => {
        console.log("OSC vezérlő készen áll");
    });

    Amikor az OSC kapcsolat készen áll, egy üzenetet írunk a konzolra.

    OSC Parancsok Küldése

    Az alábbi függvények az OSC üzenetek küldését végzik:

    setFile(filePath, bufferName)

    function setFile(filePath, bufferName) {
        udpPort.send({
            address: "/setFile",
            args: [filePath, bufferName]
        });
        console.log(`Fájl beállítva: ${filePath}, buffer: ${bufferName}`);
    }

    Egy fájl beállítását végzi egy adott buffer névre.

    play(bufferName)

    function play(bufferName) {
        udpPort.send({
            address: "/play",
            args: [bufferName]
        });
        console.log(`Lejátszás indítása: ${bufferName}`);
    }

    Lejátszási parancs küldése egy adott buffer névre.

    stop(fadeTime, bufferName)

    function stop(fadeTime, bufferName) {
        udpPort.send({
            address: "/stop",
            args: [fadeTime, bufferName]
        });
        console.log(`Lejátszás leállítása: ${bufferName}, fade-out: ${fadeTime}s`);
    }

    Leállítási parancs küldése egy adott bufferre, egy fade-out idővel.

    OSC Üzenetek Fogadása

    udpPort.on("message", (oscMsg) => {
        if (oscMsg.address === "/playbackPosition") {
            let time = Math.floor(oscMsg.args[0]);
            let min = Math.floor(time / 60);
            let sec = time % 60;
            let formattedTime = `${min}:${sec.toString().padStart(2, '0')}`;
            
            console.log(`Lejátszási pozíció: ${formattedTime}`);
    
            // Küldjük az összes csatlakozott WebSocket kliensnek
            wss.clients.forEach(client => {
                if (client.readyState === WebSocket.OPEN) {
                    client.send(JSON.stringify({ type: "position", time: formattedTime }));
                }
            });
        }
    });

    Ha egy /playbackPosition üzenetet kapunk:

    • Az idő másodpercekben érkezik.
    • Átalakítjuk percekké és másodpercekké.
    • Kiírjuk a konzolra.
    • Minden WebSocket kliensnek elküldjük az időt JSON formátumban.

    WebSocket Szerver Beállítása

    const WebSocket = require('ws');

    Importáljuk a WebSocket modult.

    const wss = new WebSocket.Server({ port: 8080 });

    Létrehozunk egy WebSocket szervert a 8080-as porton.

    wss.on("connection", (ws) => {
        console.log("Új WebSocket kapcsolat");

    Amikor egy új WebSocket kliens csatlakozik, kiírjuk a konzolra.

    WebSocket Üzenetek Kezelése

        ws.on("message", (message) => {
            try {
                const data = JSON.parse(message);
                console.log("Kliens üzenet:", data);

    Ha a kliens küld egy üzenetet, JSON-ként dolgozzuk fel.

                if (data.command === "setFile") {
                    setFile(data.filePath, data.bufferName);
                } else if (data.command === "play") {
                    play(data.bufferName);
                } else if (data.command === "stop") {
                    stop(data.fadeTime, data.bufferName);
                }

    A beérkező parancsokat a megfelelő függvényekkel továbbítjuk az OSC szerver felé.

            } catch (err) {
                console.error("Hibás üzenet:", err);
            }
        });

    Ha a JSON formátum hibás, hibaüzenetet írunk ki.

    WebSocket Kapcsolat Bontása

        ws.on("close", () => {
            console.log("WebSocket kapcsolat bezárva");
        });

    Ha a kapcsolat megszakad, kiírjuk a konzolra.

    WebSocket Szerver Indítása

    console.log("WebSocket szerver elindítva a 8080-as porton.");

    Induláskor egy üzenetet írunk ki a konzolra.

    Összegzés

    Ez a Node.js alkalmazás kétirányú kommunikációt biztosít:

    • OSC-n keresztül SuperColliderhez csatlakozik, és fájlok betöltését, lejátszást, illetve leállítást vezérel.
    • WebSocket szerverként működik, és kliensekkel kommunikál, lehetővé téve számukra az SC vezérlését és a lejátszási információk fogadását.

    Az alkalmazás lehetővé teszi, hogy valós időben történjen a zenei fájlok lejátszása és vezérlése egy távoli SC szerveren keresztül.

    Node.js indítása

    pm2 start wss_osc.js --name osc-controller

    Node.js környezet kialakítása

    https://chatgpt.com/share/67acf90a-a484-8008-afc6-508c209dd448

    https://chatgpt.com/share/67acf93c-3f0c-8008-8c0c-ac79c8ab96df

  • Audio rendszer: szerverek és szolgáltatások indítása

    Az audio rendszer összetevői: SuperCollider – valósidejű audioszerver; JACK Audio Connection Kit – audio szerver a ki- és bemenetek vezérlésére; DarkIce – a kimenetet küldi IceCast2 szerver felé; IceCast2 – online stream-szerver.

    AutoStart szolgáltatások

    DarkIce

    service: darkice

    A DarkIce szolgáltatás automatikusan indul a szerver bootolását követően, az mtm felhasználó szolgáltatásaként.

    Konfigurációs: /home/mtm/.darkice.cfg

    IceCast2

    service: icecast2

    Az IceCast2 szerver automatikusan indul a szerver bootolását követően, és létrehozza az mtm.mp3 mountpontot.

    URL on LAN-66: http://192.168.66.12:8000/mtm.mp3

    URL on LAN-67: http://192.168.67.113:8000/mtm.mp3

    Konfigurációs fájl: /etc/icecast2/icecast.xml

    Manuálisan idítandó szolgáltatások

    A szolgáltatások indítását az mtm nevű felhasználónak kell elvégeznie, a számozásnak megfelelő sorrendben.

    1. JACK service indítása ALSA driverrel.

    Script: /home/mtm/start_jack_server_sh

    2. Super Collider indítása

    Indítás: sclang

    Boot: s.boot;

    3. Super Collider – DarkIce kapcsolat

    Script: /home/mtm/jack.sh (darkice-port)

    4. Teszt

    SC script: 
    { SinOsc.ar(440, 0, 0.3).dup }.play;

    Teszt leállítása

    s.freeAll; 

    Teljes SC szerver újrakezdése, minden futó Synth és Group törlése.

  • JACK Audio Connection Kit

    A JACK Audio Connection Kit egy rendkívül erőteljes és rugalmas eszköz, amely lehetővé teszi a professzionális audiofeldolgozás végzését Linux környezetben. A telepítési és konfigurálási útmutató, valamint a példák és megoldások segítenek a felhasználóknak abban, hogy a JACK-ot sikeresen használhassák saját projektjeikben.

    Telepítés

    A JACK telepítése az Ubuntu Server rendszerre a következő lépéseken keresztül történik:

    Nyisd meg a terminált a szerveren.

    Frissítsd a csomaglistát az alábbi parancs végrehajtásával:

    sudo apt update

    Töltsd le és telepítsd a JACK csomagot:

    sudo apt install jackd2

    A telepítés végén ellenőrizd, hogy a JACK sikeresen telepítve lett:

    jackd --version

    Megjegyzés: A JACK telepítése előtt ajánlott telepíteni a következő csomagokat is, amelyek támogatják a JACK működését:

    • libjack-jackd2-0
    • qjackctl (grafikus kezelőfelület a JACK számára)
    • pulseaudio-module-jack (ha PulseAudio-t használsz)

    Konfiguráció

    A JACK konfigurálásához szükség van néhány alapvető beállításra, amelyek az audio rendszered és az eszközeid specifikációitól függenek. Az alábbiakban bemutatjuk a legfontosabb konfigurációs lehetőségeket:

    1. JACK hangkártya beállítások

    A JACK indítása előtt meg kell határoznod, hogy melyik hangkártyát szeretnéd használni. Ezt a következő parancs segítségével teheted meg:

    jackd -d alsa -d hw:0

    Itt a „-d alsa” jelzi, hogy az ALSA (Advanced Linux Sound Architecture) drivert használod, míg a „-d hw:0” a 0. számú hangkártyádat jelöli.

    2. Késleltetés beállítása

    A JACK késleltetésének beállítása kulcsfontosságú a valós idejű audio feldolgozáshoz. A következő parancs segítségével állíthatod be:

    jackd -d alsa -p 128 -n 2

    Itt a „-p 128” a mintát (buffer) méretét, míg a „-n 2” a minták számát jelöli. A megfelelő érték kiválasztása az alkalmazásaid teljesítményétől és a rendszered terhelésétől függ.

    Használati példák

    Példa 1: Live Zeneprodukcó JACK-kal

    Tegyük fel, hogy élő zenei produkciót szeretnél létrehozni a JACK segítségével. Ehhez csatlakoztathatsz különböző audio forrásokat, mint például mikrofonokat és hangszereket, majd kezelheted azokat egy DAW (Digital Audio Workstation) szoftver segítségével, mint az Ardour vagy a Reaper.

    Példa 2: JACK használata virtuális hangkártyával

    A JACK képes virtuális hangkártyák létrehozására is. Például, ha a JACK-et PulseAudio eszközként használod, a következő parancsot futtathatod:

    qjackctl

    Ez megnyitja a grafikus felületet, ahol kezelheted a különböző csatlakozásokat és beállításokat.

    Példa 3: Audioprocessing és MIDI

    A JACK lehetőséget biztosít MIDI eszközök használatára is. Felállíthatsz egy egyszerű rendszert, ahol például egy MIDI billentyűzetet használsz virtuális hangszerekkel. A MIDI csatornák beállításához a következő parancsot futtathatod:

    aconnect -i

    Ez lehetővé teszi, hogy látd az összes elérhető MIDI bemenetet.

    Troubleshooting

    A következő szakaszban a JACK-el kapcsolatos leggyakoribb 10 hibajelenséget és azok megoldásait találod.

    1. A JACK nem indítható el: Ellenőrizd, hogy egy másik alkalmazás nem használja-e a hangkártyát.
    2. Folyamatos pops és kattogó hang: Növeld a késleltetést a jackd indításakor.
    3. Alacsony hangszint: Ellenőrizd a JACK keverőt, és állítsd be a hangerőt vagy a fő keverőt.
    4. Nem hallható a bemeneti jel: Győződj meg arról, hogy a bemeneti eszköz helyesen van csatlakoztatva és aktív.
    5. Fluctuáló késleltetés: Próbáld csökkenteni más alkalmazások által használt CPU-teljesítményt.
    6. JACK és PulseAudio konfliktus: A PulseAudio-t le kell állítani, mielőtt a JACK-et indítanád.
    7. Raymond D. Johansen hiba: Frissítsd a JACK és a PulseAudio verzióját.
    8. Az eszközök nem láthatók a JACK felületén: Ellenőrizd a JACK beállításait, és győződj meg arról, hogy a források aktiválva vannak.
    9. A JACK nem reagál a MIDI parancsokra: Használj egy megfelelő MIDI-routing szoftvert, mint pl. a a2jmidid.
    10. Szabványos hibaüzenetek: Nézd át a rendszer naplófájljait, és próbáld meg kitalálni a problémát a log alapján.

    JACK telepítése és konfigurálása hangkártya nélküli környezetben

    Az Ubuntu Server környezetben a JACK Audio Connection Kit (JACK) egy professzionális hangkiszolgáló API, amely valós idejű, alacsony késleltetésű kapcsolatokat biztosít az audio- és MIDI-adatok között különböző alkalmazások számára. Ez különösen hasznos professzionális online rádiók létrehozásához, még olyan hardverkörnyezetben is, ahol nincs dedikált hangkártya.

    JACK telepítése és konfigurálása hangkártya nélküli környezetben

    Telepítés: Az Ubuntu Serveren a JACK telepítése az alábbi parancsokkal történik:

    sudo apt-get update sudo apt-get install jackd2

    Virtuális hangkártya beállítása:

    Hangkártya hiányában az alsa_loopback modult használhatjuk virtuális hangkártyaként:

    sudo modprobe snd-aloop 

    A modul automatikus betöltéséhez a rendszer indításakor adjuk hozzá a /etc/modules fájlhoz:

    echo "snd-aloop" | sudo tee -a /etc/modules

    JACK konfigurálása: A JACK indításához és a virtuális eszköz használatához az alábbi parancsot használhatjuk:

    jackd -d alsa -d hw:Loopback,0 

    Ez a parancs az ALSA Loopback eszközt használja bemenetként és kimenetként.

    DarkIce integráció

    A DarkIce egy élő audio streamer, amely képes hangot rögzíteni egy audio interfészről, kódolni azt, és továbbítani egy streaming szerverre, például IceCast vagy ShoutCast.

    Hozzunk létre egy konfigurációs fájlt, például /etc/darkice.cfg, az alábbi tartalommal:

    duration = 0 # Felvétel időtartama másodpercben, 0 a végtelenhez bufferSecs = 5 # Puffer mérete másodpercben reconnect = yes # Újracsatlakozás megszakadás esetén [input] 
    device = jack # Bemeneti eszköz sampleRate = 44100 # Mintavételezési frekvencia bitsPerSample = 16 # Bitek száma mintánként channel = 2 # Csatornák száma (sztereó) 
    [icecast2-0] 
    bitrateMode = cbr # Bitráta mód (állandó) format = mp3 # Kimeneti formátum bitrate = 128 # Bitráta kbps-ben server = localhost port = 8000 password = jelszo mountPoint = stream name = My Radio Station

    A DarkIce indítása a konfigurációs fájl használatával:

    darkice -c /etc/darkice.cfg

    SoundCollider integráció

    A SoundCollider egy Python alapú eszköz, amely lehetővé teszi az audiofolyamok valós idejű feldolgozását és manipulálását.

    Telepítés: Győződjünk meg arról, hogy a Python és a szükséges csomagok telepítve vannak:

    sudo apt-get install python3 python3-pip pip3 install soundcollider

    Használat: Az alábbi Python példa bemutatja, hogyan lehet egy egyszerű audiofolyamot létrehozni és feldolgozni a SoundCollider segítségével:

    from soundcollider import * 
    # JACK kliens létrehozásaclient = JackClient(name="MyRadio") 
    
    # Audio forrás létrehozása source = AudioSource(client, "input") 
    # Effekt lánc létrehozása effect = EffectChain(source)effect.add(Reverb()) effect.add(EQ()) 
    # Kimenet létrehozása output = AudioOutput(effect, "output") 
    # Futtatás client.run() 

    Ez a kód egy JACK klienst hoz létre, amely egy bemeneti forrást olvas, alkalmaz egy effektláncot (például visszhang és EQ), majd a feldolgozott hangot egy kimenetre küldi.

    Összefoglalás

    A JACK, a DarkIce és a SoundCollider együttes használata lehetővé teszi egy professzionális online rádióállomás létrehozását Ubuntu Server környezetben, még hangkártya nélküli hardveren is. A JACK biztosítja a valós idejű audio útvonalakat, a DarkIce kezeli a streaminget, míg a SoundCollider lehetővé teszi az audiofolyamok valós idejű feldolgozását és manipulálását Pythonban.

    A JACK API főbb funkciói és lehetőségei:

    1. Kliens létrehozása és kezelése: Az alkalmazások JACK kliensként regisztrálhatnak a jack_client_open() függvény segítségével, amely kapcsolatot létesít a JACK szerverrel. A kliens regisztrálása után az alkalmazás képes lesz audioadatokat küldeni és fogadni.
    2. Portok létrehozása és kezelése: A kliensek portokat hozhatnak létre az audioadatok küldésére és fogadására. A portok lehetnek bemeneti vagy kimeneti típusúak, és az alkalmazások ezeken keresztül kommunikálhatnak más JACK kliensekkel vagy hardvereszközökkel.
    3. Folyamat visszahívás (process callback) beállítása: A kliensek regisztrálhatnak egy folyamat visszahívási függvényt, amelyet a JACK szerver hív meg minden feldolgozási ciklusban. Ez a függvény felelős az audioadatok feldolgozásáért valós időben.
    4. Időkezelés: A JACK API időkezelési funkciókat is biztosít, amelyek lehetővé teszik az alkalmazások számára az időbélyegek és a mintavételezési frekvenciák kezelését, biztosítva a pontos időzítést a hangfeldolgozás során.
    5. Szállítási és időbázis vezérlés: A JACK támogatja a szállítási vezérlést, amely lehetővé teszi az alkalmazások számára a lejátszás, megállítás és pozicionálás vezérlését egy közös idővonalon, megkönnyítve az együttműködést több kliens között.
    6. MIDI adatkezelés: A JACK API támogatja a MIDI adatkezelést is, lehetővé téve az alkalmazások számára a MIDI üzenetek küldését és fogadását valós időben.

    Python és JACK együttműködés

    Python és JACK együttműködésére több lehetőség is rendelkezésre áll, főként a jackclient-python és a PyAudio csomagok segítségével. Ezek lehetővé teszik Python alkalmazások számára, hogy valós időben csatlakozzanak a JACK audio szerverhez, kezeljék az audiofolyamokat, és akár valós idejű hangfeldolgozást is végezzenek.


    1. jackclient-python használata

    A jackclient-python csomag egy Python wrapper a JACK API-hoz, amely lehetővé teszi Python alkalmazások számára a JACK szerver kezelését, az audioadatok átvitelét és a MIDI kommunikációt.

    Telepítés

    A jackclient-python csomagot a következő paranccsal telepítheted:

    pip3 install jack-client

    Egyszerű JACK kliens Pythonban

    A következő példa bemutat egy alapvető Python JACK klienst, amely a bemeneti audiojelet továbbítja a kimenetre:

    import jack
    # JACK kliens létrehozása
    client = jack.Client("MyPythonClient")
    # Bemeneti és kimeneti portok létrehozása
    client.inports.register("input")
    client.outports.register("output")
    # Feldolgozási visszahívás beállítása
    @client.set_process_callback
    def process(frames):
        in_buffer = client.inports[0].get_array()
        out_buffer = client.outports[0].get_array()
        out_buffer[:] = in_buffer  # Másolás bemenetből a kimenetbe
    
    # JACK kapcsolat aktiválása
    with client:
        client.connect("system:capture_1", client.inports[0].name)
        client.connect(client.outports[0].name, "system:playback_1")
        input("Nyomj Entert a kilépéshez...\n")
    

    📌 Mit csinál a fenti kód?

    • Létrehoz egy JACK klienst „MyPythonClient” néven.
    • Létrehoz egy bemeneti (input) és egy kimeneti (output) portot.
    • A process() függvény minden JACK feldolgozási ciklusban lemásolja a bemeneti adatokat a kimeneti portba.
    • A rendszer bemenetét (system:capture_1) összeköti a kliens bemenetével.
    • A kliens kimeneti portját összeköti a rendszer lejátszó csatornájával (system:playback_1).

    2. JACK és Python MIDI feldolgozása

    A JACK MIDI képességeit is használhatjuk Pythonban:

    @client.set_midi_process_callback
    def process_midi(frames):
        for port in client.midi_inports:
            for message in port.incoming_midi_events():
                print(f"MIDI üzenet érkezett: {message.bytes}")

    📌 Mit csinál ez a kód?

    • A JACK MIDI portokon beérkező üzeneteket figyeli és kiírja a konzolra.

    3. JACK és PyAudio kombinálása

    A PyAudio csomag is használható JACK interfésszel. Az alábbi kód egy JACK-alapú hangrögzítést és visszajátszást valósít meg PyAudio segítségével:

    import pyaudio
    
    p = pyaudio.PyAudio()
    
    # JACK kompatibilis bemenet és kimenet létrehozása
    stream = p.open(format=pyaudio.paInt16,
                    channels=2,
                    rate=44100,
                    input=True,
                    output=True,
                    input_device_index=0,
                    output_device_index=0)
    
    print("Felvétel és lejátszás indítása...")
    while True:
        data = stream.read(1024)
        stream.write(data)
    

    📌 Mit csinál ez a kód?

    • Felveszi az audio adatokat és azonnal visszajátssza őket.
    • A JACK audió interfészként való használatához a JACK kompatibilis hangkártyát kell kiválasztani PyAudio konfigurációban.

    4. JACK + Python egy online rádióhoz (DarkIce és IceCast)

    Egy Python program, amely egy JACK-alapú hangstreamet továbbít IceCast szerverre:

    import subprocess
    
    darkice_conf = """
    [general]
    duration = 0
    bufferSecs = 5
    reconnect = yes
    
    [input]
    device = jack
    sampleRate = 44100
    bitsPerSample = 16
    channel = 2
    
    [icecast2-0]
    bitrateMode = cbr
    format = mp3
    bitrate = 128
    server = localhost
    port = 8000
    password = hackme
    mountPoint = myradio
    name = MyPythonRadio
    """
    
    with open("/tmp/darkice.cfg", "w") as f:
        f.write(darkice_conf)
    
    # DarkIce indítása Pythonból
    subprocess.run(["darkice", "-c", "/tmp/darkice.cfg"])

    📌 Mit csinál ez a kód?

    • Dinamikusan létrehoz egy darkice.cfg fájlt.
    • A DarkIce-t elindítja a fájl alapján, ami a JACK hangfolyamot továbbítja egy IceCast szerverre.

    Összegzés

    Python és JACK együttműködése számos lehetőséget kínál:

    Valós idejű audio adatfeldolgozás
    MIDI eszközök kezelése
    Online rádió streaming (DarkIce, IceCast)
    Hangszintézis és effektfeldolgozás (SuperCollider, SoundCollider)
    Alacsony késleltetésű hangkeverés

    JACK és Python kombinációjával könnyen létrehozhatsz egyéni hangfeldolgozó alkalmazásokat, rádióállomásokat, vagy akár valós idejű MIDI vezérelt rendszereket.

  • FFMPEG: audio stream normalizálása

    Az ffmpeg tartalmaz egy loudnorm nevű filtert, amely kiegyensúlyozza a hangerőt az EBU R128 szabvány szerint. Egy másik lehetőség a dynaudnorm (Dynamic Audio Normalizer), amely valós időben végzi a hangerőkiegyenlítést.

    Az alábbi parancs egy Icecast streamet fogad forrásként, normalizálja a hangerőt, majd továbbítja egy másik Icecast szerverre:

    ffmpeg -i http://forras-stream-url/orosfm.mp3 \
    -filter_complex "dynaudnorm=f=150:g=5" \
    -c:a libmp3lame -b:a 128k -content_type audio/mpeg \
    -f mp3 icecast://user:password@cel-szerver:8000/stream.mp3

    Magyarázat a parancshoz

    • -i http://forras-stream-url/orosfm.mp3 → Forrásstream megadása.
    • -filter_complex "dynaudnorm=f=150:g=5"Dynamic Audio Normalizer:
      • f=150: Frekvenciatartomány (minél magasabb, annál simább).
      • g=5: Maximális hangerő növekedés (dB-ben).
    • -c:a libmp3lame -b:a 128k → MP3 kódolás, 128 kbps bitráta.
    • -content_type audio/mpeg → Megfelelő MIME-típus beállítása Icecast számára.
    • -f mp3 → MP3 formátum beállítása.
    • icecast://user:password@cel-szerver:8000/stream.mp3 → Cél Icecast szerver címe, felhasználónévvel és jelszóval.

    Alternatíva: loudnorm használata (precízebb, de késleltethet)

    Ha pontosabb normalizálást akarsz az EBU R128 szabvány szerint, használhatod a loudnorm filtert:

    ffmpeg -i http://forras-stream-url/orosfm.mp3 \ -filter_complex "loudnorm=I=-16:TP=-1:LRA=11" \ -c:a libmp3lame -b:a 128k -content_type audio/mpeg \ -f mp3 icecast://user:password@cel-szerver:8000/stream.mp3

    Paraméterek magyarázata:

    I=-16 → Integrated loudness (integrált hangerő) -16 LUFS

    Ez az átlagos hangerősség a teljes audio időtartama alatt.

    Ajánlott értékek:

    • Streaming (Spotify, YouTube, Apple Music, stb.): általában -14 vagy -16 LUFS.
    • TV és rádióadások (EBU R128 szabvány): általában -23 LUFS.

    TP=-1 → True Peak (csúcshangerő) -1 dBFS

    A digitális hangban a maximális csúcshangszint (Peak Level) korlátozása.

    Ajánlott értékek:

    • CD-mastering: -0.3 dBFS
    • Streaming szolgáltatások: -1 dBFS (biztonsági tartaléknak)

    LRA=11 → Loudness Range (hangerő dinamika tartomány) 11 LU

    A halk és hangos részek közötti dinamikai különbség. Minél kisebb az érték, annál kiegyenlítettebb a hangerő.

    Ajánlott értékek:

    • Podcastok, beszédhangok: 3-6 LU (kevés dinamika)
    • Film, zene, rádió: 8-15 LU (nagyobb dinamika)

    Melyiket válaszd?

    • dynaudnorm: Javasolt valós idejű stream esetén, mert gyors és dinamikusan alkalmazkodik.
    • loudnorm: Ha pontosabb és szabványosított normalizálást szeretnél, de kicsit késleltethet.

    A measure és apply módok használata

    Ha további finomhangolásra van szükséged, akkor az FFmpeg ezt a szűrőt képes kétlépcsős normalizálásra is használni (measure és apply módokkal).

    Az FFmpeg loudnorm szűrőjét kétlépcsős módban is használhatod, ami precízebb hangerő-normalizálást biztosít. Ez különösen hasznos lehet, ha az audioanyagok nagyon eltérő hangerőszintekkel rendelkeznek.

    🔹 1. lépés: Elemzés (measure mód)

    Elsőként lefuttatjuk az FFmpeg-et úgy, hogy csak analizálja a hangerőt, de nem módosítja az audiot.

    ffmpeg -i input.mp3 -af loudnorm=I=-16:TP=-1:LRA=11:print_format=json -f null -

    Mit csinál ez?

    • Nem módosítja az audiot, csak elemzi.
    • A parancs végén JSON formátumban kiírja a szükséges hangerőértékeket, például:
    {
    "input_i": "-20.3",
    "input_tp": "-2.5",
    "input_lra": "6.2",
    "input_thresh": "-30.0",
    "output_i": "-16.0",
    "output_tp": "-1.0",
    "output_lra": "11.0",
    "output_thresh": "-26.0",
    "target_offset": "0.0"
    }

    Ezek az értékek kellenek majd a következő lépésben. Jegyezd fel őket!

    🔹 2. lépés: Alkalmazás (apply mód)

    Most használjuk a kapott értékeket, hogy normalizáljuk az audiot.

    ffmpeg -i input.mp3 -af loudnorm=I=-16:TP=-1:LRA=11:measured_I=-20.3:measured_TP=-2.5:measured_LRA=6.2:measured_thresh=-30.0:offset=0.0 -c:a libmp3lame -b:a 192k output.mp3

    Mit csinál ez?

    • Az elemzett értékeket használja fel a hangerő precíz beállításához.
    • Megőrzi a dinamikát, de minden egyes részlet a kívánt -16 LUFS hangerőszinten lesz.
    • Megakadályozza a torzítást, mivel a csúcshangerő (-1 dBFS) limitálva van.

    Összegzés

    1. Elemzés (measure) → Megkapod a hangerőadatokat.
    2. Alkalmazás (apply) → A kapott adatokkal normalizálod az audiot.

    Ez a kétlépcsős megoldás sokkal pontosabb, mint az egyetlen loudnorm futtatása, mert az FFmpeg így nem csak találomra állítja be a hangerőt, hanem konkrét mérési adatok alapján dolgozik.

    Tipp: Ha Icecast streamre alkalmaznád ezt, akkor a második lépésben output.mp3 helyett közvetlenül streamelheted az eredményt:

    ffmpeg -i http://forras-stream-url/orosfm.mp3 -af loudnorm=I=-16:TP=-1:LRA=11:measured_I=-20.3:measured_TP=-2.5:measured_LRA=6.2:measured_thresh=-30.0:offset=0.0 -c:a libmp3lame -b:a 128k -f mp3 icecast://user:password@cel-szerver:8000/stream.mp3

  • YouTube-DLP

    A YouTube-DLP (röviden yt-dlp) egy fejlettebb, aktívan karbantartott, nyílt forráskódú eszköz, amelyet videók és audió fájlok letöltésére használnak különböző weboldalakról, köztük a YouTube-ról, Twitch-ről, Facebookról és sok más platformról.

    Az yt-dlp a youtube-dl egy továbbfejlesztett verziója, amely számos új funkcióval és fejlesztéssel bővült.

    Mire használható?

    1️⃣ Videók letöltése

    Bármilyen publikus vagy nem listázott YouTube-videó letöltése:

    yt-dlp "https://www.youtube.com/watch?v=VIDEO_ID"

    A letöltött fájl alapértelmezetten a legjobb elérhető minőségben kerül mentésre.

    2️⃣ Csak az audió letöltése (például MP3 formátumban)

    Ha csak a hangfájlt szeretnéd letölteni, például zenehallgatás céljából:

    yt-dlp -x --audio-format mp3 "https://www.youtube.com/watch?v=VIDEO_ID"

    Magyarázat:

    • -x: Az audió kivonása a videóból.
    • --audio-format mp3: Az audió MP3 formátumba konvertálása.

    3️⃣ Lejátszási listák letöltése

    Egy teljes YouTube lejátszási lista letöltése:

    yt-dlp -f best "https://www.youtube.com/playlist?list=PLAYLIST_ID"

    Ez az összes videót letölti a lejátszási listából.

    4️⃣ Élő közvetítések rögzítése

    YouTube Live vagy más streaming szolgáltatások élő adásának mentése:

    yt-dlp -f best "https://www.youtube.com/live/STREAM_ID" -o "live_recording.mp4"

    🔹 Tipp: Ha folyamatosan rögzíteni szeretnéd az élő adást:

    yt-dlp -f best -o "live_%Y-%m-%d_%H-%M-%S.mp4" "https://www.youtube.com/live/STREAM_ID"

    Ez időbélyegzővel ellátott fájlokat hoz létre.

    5️⃣ Csak a letöltési URL lekérése (HLS/M3U8 stream elérése)

    Ha egy adott videó közvetlen stream URL-jére van szükséged (például FFMPEG-hez), futtasd:

    yt-dlp -g "https://www.youtube.com/watch?v=VIDEO_ID"

    Ez visszaadja az MP4 vagy HLS stream elérési útját.

    6️⃣ Letöltési formátum megadása

    A kívánt formátum kiválasztása (pl. 1080p MP4 letöltése):

    yt-dlp -f "bestvideo[height<=1080]+bestaudio" "https://www.youtube.com/watch?v=VIDEO_ID"

    Magyarázat:

    • bestvideo[height<=1080]: A legjobb 1080p vagy alacsonyabb felbontású videó letöltése.
    • +bestaudio: A legjobb hang letöltése és automatikus egyesítése a videóval.

    7️⃣ Feliratok letöltése

    Ha egy YouTube-videóhoz felirat is elérhető, letöltheted az alábbi paranccsal:

    yt-dlp --write-subs --sub-lang en "https://www.youtube.com/watch?v=VIDEO_ID"

    🔹 Tipp: Az összes elérhető nyelvű felirat letöltése:

    yt-dlp --write-auto-sub --all-subs "https://www.youtube.com/watch?v=VIDEO_ID"

    8️⃣ YouTube Premium tartalmak letöltése

    Ha van YouTube Premium előfizetésed, bejelentkezhetsz az yt-dlp-be, hogy privát videókat vagy prémium tartalmakat tölts le:

    yt-dlp --cookies cookies.txt "https://www.youtube.com/watch?v=VIDEO_ID"

    Ehhez előbb exportálnod kell a YouTube sütiadataidat a böngésződből.

  • YouTube Live stream rögzítése FFMPEG segítségével

    URL-ben lévő élő videót FFMPEG-gel rögzíteni Ubuntu szerveren úgy, hogy 20 perces darabokban hoz létre fájlokat. A YouTube Live stream rögzítése FFMPEG segítségével megoldható, de mivel a YouTube nem támogatja közvetlenül az FFMPEG URL alapú stream-rögzítését, a folyamatnak két lépése van, Python könyvtár használatával.

    1. A stream URL beszerzése:
      Erre például a yt-dlp (Python – YouTube-DLP) használható, amely képes a YouTube élő adásának közvetlen HLS (HTTP Live Streaming) URL-jét lekérni.
    2. A stream rögzítése FFMPEG-gel
      A HLS URL-t FFMPEG-gel rögzítheted, miközben 20 perces szegmensekre osztod a fájlokat.

    Az újabb Python verziók védik a rendszerszintű Python-környezetet a pip-el történő módosításoktól. Ezért a rendszer nem engedélyezi a pip-en keresztüli csomagtelepítést a rendszerszintű Pythonba.

    Virtuális környezet létrehozásáról bővebben itt.

    A YouTube-DLP önállóan is futtatható Windows és Linux környezetben is. A YouTube-DLP (röviden yt-dlp) egy fejlettebb, aktívan karbantartott, nyílt forráskódú eszköz, amelyet videók és audió fájlok letöltésére használnak különböző weboldalakról, köztük a YouTube-ról, Twitch-ről, Facebookról és sok más platformról. Az yt-dlp a youtube-dl egy továbbfejlesztett verziója, amely számos új funkcióval és fejlesztéssel bővült.

    A YouTube-DLP (yt-dlp) leírása bővebben itt.

    1. Használj virtuális környezetet, valamint pipxet a csomag telepítéséhez (Ajánlott)

    Ez a legbiztonságosabb módszer, mivel elkülönített Python-környezetet hoz létre:

    # Virtuális környezet létrehozása 
    python3 -m venv yt-dlp-env 
    
    # Aktiváld a virtuális környezetet 
    source yt-dlp-env/bin/activate 
    
    # Telepítsd a yt-dlp-t
    pipx install yt-dlp
    
    # A `yt-dlp` használata
    yt-dlp --version

    A virtuális környezet (venv) vagy a pipx használata jobb megoldás, mivel ezek nem módosítják a rendszerszintű Python-környezetet, és könnyebben kezelhetők

    2. Szerezd meg a HLS URL-t

    Használd a következő parancsot a YouTube élő adás stream URL-jének lekéréséhez:

    yt-dlp -g "https://www.youtube.com/live/SpTcIBfDvg4?si=kc1YfCGIg5Zq4hZ7"

    A parancs a stream közvetlen HLS URL-jét adja vissza, például:

    https://manifest.googlevideo.com/api/manifest/hls_playlist/... (hosszú URL)

    HLS URL használata bash scriptben:

    #!/bin/bash
    
    # HLS URL lekérése 
    HLS_URL=$(yt-dlp -g "https://www.youtube.com/live/SpTcIBfDvg4?si=kc1YfCGIg5Zq4hZ7")
    
    # Csak az audio stream  rögzítése - 20 perces darabokban
    ffmpeg -i "$HLS_URL" - -vn -acodec libmp3lame -b:a 192k -f segment -segment_time 1200 -reset_timestamps 1 output_%03d.mp3

    Megjegyzés: az FFMPEG megszakadhat, ha a hálózati kapcsolat instabil, ezért érdemes a folyamatot monitorozni vagy újraindítási logikát hozzáadni.