Hlavní navigace

Asterisk 15: WebRTC videokonference

Marek Červenka

Asterisk 15 přináší řadu novinek, které se týkají především video hovorů a konferencí. Videokonference typu SFU, zjednodušení konfigurace WebRTC a 3D audio konference. Pojďme si je podrobně projít.

Obecně o Asterisku

Na úvod krátce o Asterisku pro neznalé: Asterisk je open-source framework pro budování komunikačních systémů a aplikací. Asterisk pohání různé pobočkové ústředny, konferenční servery, VoIP Gatewaye a další speciální aplikace. Projekt je sponzorován firmou Digium, která prodává support a komerční produkty.

První verzi dal k dispozici Mark Spencer v roce 1999. Mark Spencer je mimo jiné také původním autorem programu dnes známého pod jménem Pidgin.

V České republice existují firmy, které poskytují komerční support nebo produkty nad Asteriskem postavené. Jsou to například Canistec, www.ipex.cz a další.

Anketa

Používáte ve firmě nějakou variantu Asterisku?

Asterisk 15 je Standard Support verze. Tzn. není dlouhodobě podporovaná a tudíž se nehodí pro projekty, u kterých je třeba zajistit dlouhodobou podporu. K tomuto účelu slouží tzv. LTS verze. Standardní verze je určena na projekty kde je možné dělat jednoduše upgrady, na testování, na ověřování nových funkcí atp.

Dle vývojářů by verze 16 již měla být určitě LTS. Zaměřena bude hlavně na doladění podpory videa.

Release Series Release Type Release Date Security Fix Only EOL
11.x LTS 25.10.2012 25.10.2016 25.10.2017
12.x Standard 20.12.2013 20.12.2014 20.12.2015
13.x LTS 24.10.2014 24.10.2020 24.10.2021
14.x Standard 26.9.2016 26.9.2017 26.9.2018
15.x Standard 10. 2017 (tentative) 10. 2018 (tentative) 10. 2019 (tentative)

Hlavní novinky verze 15

Streams

Hlavní a v podstatě jedinou velkou novinkou verze 15 je přidání podpory videokonference typu SFU. To znamená, že se Asterisk přidal do rodiny projektů, které SFU implementují např. mediasoup, kurento, Janus, Jitsi Videobridge a další.

Aby bylo možné tuto velkou novinku přidat, bylo potřeba upravit architekturu. Byl přidán koncept streamů, které můžou být jak jednosměrné, tak obousměrné. V oblasti videokonferencí je běžné mít 8 příchozích streamů od 8 účastníků a jeden odchozí stream.

Do verze 15 se používal koncept, kdy se přímo manipulovalo s jednotlivými kanály a tento přístup příliš nevyhovoval trendu multi-party audio/video konferencí.

Jak prakticky tedy novou architekturu použít? Stáhnout, zkompilovat a nainstalovat Asterisk 15. Poté je potřeba připravit certifikát pro doménu. Stačí certifikát zdarma od Let's Encrypt.

Zprovoznit HTTP server pro SIP over Websockets. Konfigurace /etc/asterisk/http.conf bude vypadat přibližně takto:

[general]
enabled=yes
bindaddr=0.0.0.0
bindport=8088
tlsenable=yes
tlsbindaddr=0.0.0.0:8089
tlscertfile=/etc/asterisk/keys/asterisk.pem

Vytvořit konfiguraci SIP zařízení „guest“, pomocí kterého se připojíme z prohlížeče

[transport_wss]
type=transport
bind=0.0.0.0
protocol=wss
 
[guest]
type=aor
max_contacts=5
 
[guest]
type=endpoint
context=default
direct_media=no
allow=!all,alaw,vp8,h264
aors=guest
max_audio_streams=10
max_video_streams=10
webrtc=yes
dtls_cert_file=/etc/asterisk/keys/asterisk.pem
dtls_ca_file=/etc/asterisk/keys/ca.crt

Nyní je potřeba nakonfigurovat konferenční modul v režimu SFU

[general]
 
[default_bridge]
type=bridge
video_mode=sfu
 
[default_user]
type=user
music_on_hold_when_empty=yes
music_on_hold_class=default

Dále připravíme dialplán, abychom se do konference mohli přihlásit

[default]
exten => video-conference,1,Answer()
  same => n,ConfBridge(guest)
  same => n,Hangup()

Nakonec umístíme na server webovou aplikaci, která nám obstará základní grafické rozhraní. Aplikace je na GitHubu a slouží pro demonstrační účely. Do adresáře, kde běží webový server, proveďte  git clone.

Například pro RedHat/Fedora systémy s Apachem:

# cd /var/www/html
# git clone https://github.com/asterisk/cyber_mega_phone_2k.git

V prohlížeči pak stačí zadat https://muj.test.cz/cyber_mega_phone_2k

Demo aplikace vypadá například takto

Pokud si chcete video pouze vyzkoušet, můžete použít testovací instanci na adrese -democonf.slu.cz/demo. Demo je provozováno ve spolupráci s Centrem informačních technologií na Slezské univerzitě v Opavě."

WebRTC

Další důležité úpravy, které mají souvislost s výše uvedeným, jsou na poli podpory WebRTC. Pro PJSIP přibylo zjednodušení, jak nakonfigurovat PJSIP endpoint, a to pomocí parametru webrtc=yes.

Místo této definice:

rtcp_mux=yes
use_avpf=yes
ice_support=yes
use_received_transport=yes
media_encryption=dtls
dtls_verify=fingerprint
dtls_setup=actpass

Stačí tato:

webrtc=yes

Dále byla přidána podpora režimu BUNDLE, která umožňuje mixovat více streamů na jednom portu. Tzn. bez BUNDLE by komunikační porty vypadaly např. takto:

  • UDP/10000 audio (kodek OPUS)
  • UDP/10001 video (kodek VP9)

Pomocí BUNDLE bude použit pouze jeden port, což je lepší v sítích, kde je použit NAT.

  • UDP/10000 audio+ video (kodek OPUS, kodek VP9)

V SDP se tento parametr zobrazuje jako a:group=BUNDLE

Podobná metoda se používá i pro protokol RTCP a jmenuje se RTCP-MUX. V SDP se uvádí jako  a=rtcp-mux:

  • UDP/10000 RTP audio + RTCP audio+ RTP video + RTCP video

Další příjemnou věcí z pohledu podpory WebRTC je pass-through podpora video kodeku VP9.

3D audio konference

Za zmínku stojí ještě zajímavost v modulu Confbridge. V rámci akademického projektu STEAK byla do Asterisku přidána funkcionalita, která umožňuje lépe rozeznat, kdo právě mluví v audio konferenci.

Konferenční modul vytvoří virtuální model místnosti, do které umístí účastníky. Pomocí simulace toho, že účastník mluví z nějaké části místnosti, se zlepšuje a zjednodušuje identifikace řečníka.

Pokud jste se někdy audio konference účastnili, tak víte, jak chybí vizuální kontakt s tím, kdo mluví, a dochází ke skákání do řeči.

Tento projekt se tento problém snaží řešit pomocí tzv. Binaural synthesis . Více v samostatném vědeckém článkuPodmínkou je použití stereo sluchátek a kodeku(doporučený je kodek OPUS), který podporuje stereo zvuk.

Tuto výhodu tedy nevyužijí volající z klasické mobilní nebo pevné sítě. Podívat se můžete na příklad konfigurace.

Další funkcionalita

Do dialplánové funkce CHANNEL přibyla možnost vytažení ID hovoru, které je používáno pro textové logy Asterisku. Tato funkce je výborná pro diagnostiku, kdy si k danému hovoru do CDR toto ID uložím a poté můžu problémové hovory jednoduše v textovém logu filtrovat.

Funkce se používá např. takto:

exten => _X.,n, set(CDR(userfield)=${CHANNEL(callid)})

Lorenzo Miniero, který je aktuálně známý především vývojem Janus WebRTC gatewaye a audio/video přenosy z IETF meetingů st,ojí za experimentálním patchem, který umožňuje informovat kodeky o kvalitě aktuální hovoru z RTCP dat. V praxi funkcionalita zatím bohužel není příliš využitelná.

Reference

Našli jste v článku chybu?