U prvom članku smo pokrili osnove WebRTC-a i naučili nešto više o samoj teoriji, dok smo u drugom članku prešli s teorije na praksu i tako naučili kako implementirati WebRTC signalni poslužitelj s Microsoft SignalR-om i WebRTC web aplikaciju s JavaScript API-jem u Angularu 11. U ovom članku dodajemo još jedan dio puzzle – WebRTC nativni API s Androidom.

Zašto nativna aplikacija?

Iako je WebRTC u početku stvoren kao web-based tehnologija koja ne zahtijeva razvoj i implementaciju nativnih aplikacija za više sustava, tijekom godina prepoznate su mnoge prednosti takvih implementacija te su zato ipak nativni WebRTC API-ji stvoreni. Prilikom odabira izrade nativne WebRTC aplikacije, moguće je:

  • u potpunosti pristupiti svim nativnim OS/hardverskim resursima,
  • ukloniti ograničenja i nekompatibilnosti web preglednika,
  • integrirati implementaciju WebRTC-a u bilo koje prikladno aplikacijsko okruženje,
  • dizajnirati potpuno optimizirano WebRTC iskustvo za određene uređaje,
  • izgraditi općenito brže i nesmetano WebRTC iskustvo.

Iako se čini kako je odabir rada s nativnim WebRTC aplikacijama jednostavan, važno je napomenuti kako izgradnja takvog rješenja obično zahtijeva više znanja, vremena i resursa,  te se stoga ne preporučuje za WebRTC rješenja kao što su jednostavni video ili audio chat. Slučajevi u kojima se preporučuje implementacija nativnog WebRTC rješenja uključuju:

  • specifične funkcionalnosti aplikacija (npr. dodavanje više video stream-ova iz nekoliko video izvora u jedan WebRTC video poziv, pokretanje prilagođenih algoritama video enkodiranja/dekodiranja na strani klijenta itd.),
  • aplikacije osjetljive na performanse (npr. osjetljive na kašnjenje, kvalitetu videa, kvalitetu zvuka itd.),
  • aplikacije konferencijskih poziva (za više sudionika povezanih odjednom).

Izrada nativne Android aplikacije

Creating-the-native-Android-app-WebRTC-Android-Dalibor-Kofjac-Ekobit

Mala napomena: WebRTC signalni poslužitelj i algoritam na strani poslužitelja koji su objašnjeni u prošlom članku, ovdje će se koristiti kao dio konačnog rješenja, stoga svakako pročitajte taj članak prije nego što nastavite dalje.

Za razvoj Android aplikacije u ovom članku koristit ćemo Android Studio i programski jezik Java. Proces razvoja sastojat će se od pet glavnih koraka:

1)      Android (Java) projekt

Napravite novi Android (Java) projekt u Android Studiju i odaberite željeni minimalni SDK API (npr. API 19 – Android 4.4 KitKat). Kada se izradi novi projekt, idite na datoteku “build.gradle” aplikacije i dodajte sljedeće ovisnosti biblioteke:

implementation ‘com.google.code.gson:gson:2.8.5’

implementation ‘org.webrtc:google-webrtc:1.0.25821’

implementation ‘com.microsoft.signalr:signalr:3.1.6’

2)      SignalR servis

Kao i u Angular kodu, Android implementacija također treba SignalR service koja pokreće i održava vezu sa signalizacijskim poslužiteljem te je također zadužena za slanje i primanje SignalR zahtjeva. Sljedeće dijelove SignalR service-a bih izdvojio kao najbitnije za objasniti:

  • constructor – pokreće aktivnu vezu sa signalizacijskim poslužiteljem i po potrebi primjenjuje JWT sigurnosni token
  • connect” metoda – započinje vezu sa signalizacijskim poslužiteljem
  • define” metoda – definira dolazne zahtjeve socketa
  • invoke” metoda – izvršava novi zadani zahtjev socketa
  • disconnect” metoda – prekida vezu sa signalizacijskim poslužiteljem

Kod za uslugu Android SignalR možete pronaći ovdje.

3)      Android camera capturer

Važan implementacijski dio Android WebRTC aplikacije je stvaranje camera capturer klase koja će se pobrinuti za sve funkcije povezane s upravljanjem kamerom, kao što je pristup kameri uređaja, početak snimanja videa, promjena rezolucije, promjena svjetline/kontrasta itd. Preporučeni način razvoja ove klase je proširenje osnovne klase Camera1Capturer biblioteke WebRTC (ili Camera2Capturer ovisno o ciljnom SDK-u) i razvoj potrebnih prilagođenih funkcionalnosti povrh toga. Osnovna implementacija Android camera capturera može se pronaći ovdje. Za naprednije funkcionalnosti potrebno je proširiti capturer s Android kamera2 API značajkama, ali to je priča za drugi put.

4)      Implementacija WebRTC algoritma

Posljednja i najvažnija stvar koju treba kreirati tijekom razvoja nativnog WebRTC rješenja je naravno WebRTC algoritam. To bi značilo da su potrebni koraci za uspostavljanje WebRTC poziva i prijenos audio/video podataka. Prva dva koraka (pokretanje veze sa signalizacijskim poslužiteljem i definiranje signalne komunikacije) su u osnovi isti kao u JavaScript implementaciji jedina je razlika u programskom jeziku – pročitajte o njima u tom članku. S druge strane, posljednji korak (preuzimanje korisničkog medija s uređaja) je znatno drugačiji, što znači da je za implementaciju na Androidu potrebno:

  • inicijalizirati opcije peer connection factoryja
  • kreirati peer connection factory
  • kreirati audio source i audio track instance
  • kreirati video source i video track instance
  • inicijalizirati Android camera capturer
  • pokrenuti snimanje kamerom sa odabranom razlučivosti/brzinom kadrova.

Kod za sve te radnje, kao i opća implementacija WebRTC algoritma u Androidu, dostupan je ovdje.

5)      Sigurnost preko JWT

Budući da koristimo Microsoft SignalR kao naše rješenje poslužitelja signalizacije, nativna Android WebRTC aplikacija nasljeđuje sve sigurnosne značajke koje donosi SignalR. U našem slučaju, to uključuje autorizaciju koja se vrši dohvaćanjem JWT sigurnosnog tokena putem posebnog AuthHub-a na poslužitelju signalizacije. Kasnije se ovaj token primjenjuje kada se povezuje na signalni poslužitelj putem davatelja tokena pristupa unutar usluge SignalR. Dohvaćanje JWT tokena može se vidjeti ovdje, dok se uslugu SignalR može vidjeti ovdje.

Security-over-JWT-WebRTC-Android-Dalibor-Kofjac-Ekobit

Razvijati native WebRTC aplikaciju ili možda ne?

U ovom članku smo pokazali što je moguće s nativnom Android WebRTC bibliotekom i kako to implementirati u radno rješenje s Microsoft SignalR-om. Izbor između nativne WebRTC aplikacije ili standardne web aplikacije u potpunosti ovisi o potrebama projekta, no sigurno je da nije potrebno izbjegavati nativni pristup zbog mogućih kompleksnih zahtjeva ili naizgled skupog rješenja. Razlog tome je što su tijekom godina nativne WebRTC biblioteke jako napredovale i kao što je prikazano ovdje, implementacija pomoću njih je podjednako jednostavna i izravna kao i ona standardna.

What's your reaction?