Base Camp – opiskelijayrittäjyysalustojen kehittäminen -hankkeessa on tavoitteena pilotoida erilaisia etäteknologioita mentoroinnin tukena. Tätä silmällä pitäen aiemmin luotu sovellus Intel Realsense -kameroiden video- sekä syvyyskuvan tallentamiseen muunnetaan Open Broadcast System (OBS)-liitännäiseksi, jolloin tallenteiden tekeminen yksinkertaistuu. Samalla saadaan aikaan mahdollisuus livestriimaukselle. Tässä artikkelissa käyn läpi keskeisimpiä osa-alueita OBS-liitännäisen kehittämisestä ohjelmistokehittäjän näkökulmasta.
Yleiskatsaus
Liitännäiset (engl. plugins) ovat ohjelmakirjastoja, joita käytetään toisten ohjelmien sisällä. Tässä esitelty liitännäinen mahdollistaa RGB- ja syvyyskuvien striimaamisen tai tallentamisen OBS-ohjelmalla. Liitännäisen luominen vaatii jonkin verran ymmärrystä Intel Realsense SDK:sta, sekä OBS-ohjelman liitännäisten kehittämisestä.
Kehittämäni liitännäinen koostuu pääosin viidestä tiedostosta.
- realsense-device.h – alustaa realsense-kameran, ja käynnistää datan tallennuksen
- obs_frame_processor.h/cpp – kameran tallentamien yksittäisten ruutujen käsittelylogiikka. Suodattimet ja syvyysarvojen koodaus harmaasävykuvaksi, RGB- ja syvyyskuvapisteiden sijoittelu rinnakkain.
- realsense-d400-plugin.cpp – rekisteröi liitännäisen OBS-sovellukseen
- realsense-d400-source.cpp – kytkee OBS-sovelluksen liitännäisen tapahtumakutsut aiempiin, määrittää sovelluksen säätöarvot ja piirtää kuvapistedatan liitännäisen tekstuuriin.
Liitännäinen tarvitsee osalta ohjelmistokehykset OBS-ohjelmistolle, sekä Realsense-kameroille. Molemmat ovat avoimen lähdekoodin ohjelmistoja, ja niiden asentaminen on varsin yksinkertaista. Liitännäisen kääntäminen useammalle käyttöjärjestelmälle vaatii alustakohtaiset kehitystyökalut.
Liitännäisen ohjelmallisesta toteutuksesta
Liitännäisen lähdekoodissa on monta osaa, jotka kaikki ovat tarpeellisia toiminnallisuuden ja sen laajentamisen kannalta. Videokuvan luominen olemassa olevasta pikselidatasta on ohjelmoitu olennaisilta osin realsense-d400-source.cpp-tiedoston funktioihin realsense_d400_source_update, realsense_d400_source_tick sekä realsense_d400_source_render. Tarkastellaan niiden toiminnallisuutta seuraavaksi.
realsense_d400_source_update luo gs_texture_create-kutsulla soveltuvan dynaamisesti päivitettävän tekstuurin, jos sitä ei ole vielä luotu. Tekstuurilla tarkoitetaan näytönohjaimen muistissa olevaa kuvaa. Kameran tuottamat RGB- ja syvyyskuvat yhdistetään vierekkäin. Yksittäisen kuvan resoluutio on rajattu 848×480 kuvapisteeseen, joten yhdistetyn kuvan viemä tila on 1696×480 kuvapistettä.
Kaikki grafiikan päivittämiseen tai piirtämiseen liittyvien operaatioiden on tapahduttava obs_enter_graphics() ja obs_leave_graphics() -funktiokutsujen sisällä. Silloin OBS-ohjelman abstrahoima alemman tason grafiikkarajapinnan piirtokonteksti on käytettävissä. Tämä liittyy grafiikkarajapintojen toteutukseen käyttöjärjestelmissä toimivien ikkunointijärjestelmien osalta. Yksinkertaistettuna voimme todeta, että obs_enter_graphics välittää grafiikkarajapinnalle viestin “nyt OBS-ohjelman ikkunaan ruvetaan piirtämään”, ja obs_leave_graphics välittää viestin ”nyt OBS-ohjelman ikkunaan piirtäminen on päättynyt”.
static void realsense_d400_source_update(void *data, obs_data_t *settings)
{
struct realsense_d400_source *context = reinterpret_cast<realsense_d400_source*>(data);
obs_enter_graphics();
if ( context->texture == nullptr )
{
…
context->texture = gs_texture_create( 848*2, 480, GS_RGBA, 1, nullptr, GS_DYNAMIC);
}
obs_leave_graphics();
…
}
realsense_d400_source_tick puolestaan päivittää jokaisen ruudunpäivityksen yhteydessä videotekstuurin keskusmuistiin tallennetusta kuvadatasta gs_texture_set_image-funktiokutsun avulla. frame_processor-olio käsittelee kamerasta tallennetut kuvatiedot, ja muodostaa niistä soveltuvan esityksen hyödynnettäväksi tekstuurissa. Tässä yhteydessä on hyvä muistaa, että koneen väylänopeudella on osittain merkitystä tekstuurien päivitysnopeuteen, koska tiedon on siirryttävä keskusmuistista näytönohjaimen muistiin.
static void realsense_d400_source_tick(void *data, float seconds)
{
struct realsense_d400_source *context = reinterpret_cast<realsense_d400_source*>(data);
…
const uint8_t *tmp = context->frame_processor.tmp_data.data();
obs_enter_graphics();
gs_texture_set_image( context->texture,
context->frame_processor.tmp_data.data(),
848*2*4, false);
obs_leave_graphics();
…
}
realsense_d400_source_render –funktio piirtää päivitetyn videotekstuurin ruudulle. Funktiossa sidotaan tekstuuri muodostettavaan kuvaan, sekä piirretään tekstuuri ruudulle.
static void realsense_d400_source_render(void *data, gs_effect_t *effect)
{
struct realsense_d400_source *context = reinterpret_cast<realsense_d400_source*>(data);
…
obs_enter_graphics();
gs_eparam_t *image = gs_effect_get_param_by_name(effect, ”image”);
gs_effect_set_texture(image, context->texture);
gs_draw_sprite(context->texture, 0, context->frame_processor.video_width,
context->frame_processor.video_height );
obs_leave_graphics();
}
Loput liitännäisen toiminnallisuudesta liittyvät lähes yksinomaan Intel Realsense SDK:n asetusten säätämiseen, sekä kamerasta saapuvien kuvien käsittelyn säikeistämiseen, mutta näiden toiminnan avaaminen on varsinaisen liitännäisen tekemisen ulkopuolella. Lisätietoja näistä on saatavilla Realsense2 SDK:n koodiesimerkeissä.
Liitännäisen asentaminen
Liitännäisen asentaminen vaatii liitännäisen kirjastotiedoston siirtämisen OBS-ohjelmiston liitännäisten hakemistoon realsense2-kirjastotiedoston kanssa. Esimerkiksi käyttämälläni koneella OBS-ohjelma on asennettu hakemistoon C:\Tools\obs-studio, jolloin realsense2.dll ja realsense-d400-plugin.dll kopioidaan hakemistoon C:\Tools\obs-studio\obs-plugins\64bit. Lisäksi liitännäiselle tehdään tyhjä lokalisointitiedosto en-US.ini hakemistoon C:\Tools\obs-studio\data\obs-plugins\realsense-d400\locale.
Liitännäisen käyttöönotto
Mikäli kaikki liitännäisen tiedostot on asennettu ja Realsense-kamera kytketty koneeseen, OBSissa on mahdollista lisätä kuvalähteeksi useampikin Realsense D400 Input (Kuva 1). Sen jälkeen kuvalähteen asetuksista puolestaan on valittavissa jokin kytketyistä kameroista käyttöön (Kuva 2).
Liitännäinen on julkaistu GPLv3-lisenssillä Github-verkkopalveluun. Liitännäistä hyödynnetään jatkossa Basecamp-hankkeen etäteknologiakokeiluissa, kun intensiivivalmennuksista luodaan virtuaalihologrammeja.
Kirjoittaja:
Anssi Gröhn, tietojenkäsittelyn lehtori, Basecamp-hankkeen asiantuntija, Karelia-ammattikorkeakoulu