( locsemege | 2017. 06. 28., sze – 01:07 )

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