Egyébként azon tűnődöm, hogyan lehetne hangot tömöríteni valamelyik alacsony latency-t tudó kodekkel, mint például az opus. Talán lehetne azt csinálni, hogy a kliensen pipe-sink tunkolná hanggal a named pipe-ot, majd egy shell daemon a másik végét nyalná fel, opus codec tömörítene, majd socat-ba pipe-olás után menne ki hálózatra. Szerver oldalon pedig socat után az opus codec, végül named pipe, onnan pedig pipe-source a pulseaudioban, s lőn hang. Ami ezzel gondom, az a két oldal szinkronja. Ha picit is eltér az ütemezés a gépek között, akkor vagy buffer underrun lesz, vagy overflow. Meg azt sem tudom, a hálózati csomagok jó sorrendben jönnek-e majd meg. TCP fölött gondolom, igen, ha meg UDP-t használok, magamra vessek.
Lehetne ezt így? Vagy marhaság, s ha ilyen egyszerű lenne, már rég belerakták volna a hangszerverbe?
Szerk.: Kipróbáltam. Az a vicces, hogy akar működni, bár nem működik. A szerveren kell még a module-loopback, hogy a source-ön bejövő hangot visszahurkoljuk a sink-re.
Most a kliensen egy néhány perces zenés YouTube video lezajlik alig néhány másodperc alatt. :) Felhangzanak olykor felismerhető hangrészletek. A szerveren ezt csináltam:
#!/bin/bash
VOICE_PIPE='/tmp/music.input'
if [ ! -p "$VOICE_PIPE" ]; then
rm -f "$VOICE_PIPE"
mknod "$VOICE_PIPE" p
fi
socat "TCP4-LISTEN:4713" "EXEC:opusdec --rate 44100 - $VOICE_PIPE"
A kliensen pedig:
#!/bin/bash
VOICE_PIPE="/run/user/`id -u`/pulse/fifo_output"
if [ ! -p "$VOICE_PIPE" ]; then
rm -f "$VOICE_PIPE"
mknod "$VOICE_PIPE" p
fi
socat "EXEC:opusenc --raw --raw-rate 44100 $VOICE_PIPE -" "TCP4:itt_szóljon:4713"
A szerveren az opusdec nagyon zabálja a futásidőt, de lényegesen gyorsabban falja a hangot valós időnél. Pedig arra gondoltam, szép békésen fogja felszedni a pulseaudio a fifo tartalmát. Lehet, hogy ez így is van, csak esetleg ehhez forszíroznom kell a mintavételi sebességet, vagy akármi.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE