PJSIP na Raspberry Pi jako Videozvonek

Programy, které slouží k volání přes internet z počítače nebo chytrých mobilů.
simonc
Příspěvky: 7
Registrován: čtv 22. bře 2018 11:28:41

PJSIP na Raspberry Pi jako Videozvonek

Příspěvek od simonc »

Ahoj, Dobrý den,

Píšu bakalářskou práci na téma VOIP videozvonku postaveného na RPI a PJSIP (se swig fasádou PJSUA2). Za poslední měsíce jsem se snad prokousal většinou problémů, stojím ale na tom posledním - bojuji s videem.

Efektivně chci ve výsledku postavit jednosměrný videohovor. Zvonek totiž nemá displej a ani ho vzhledem výkonosti zařízení mít nemůže (development dělám kvůli rychlost kompilace na Pi4, no škola vyžaduje, aby výsledek jel na Pi zero :roll: ).

Chci tak postavit řešení, které po stisku tlačítka zavolá na SIP linku (např Zoiper app na telefonu) i s videohovorem, ukáže obraz z kamery, umožní hlasovou komunikaci a při zadání správné sady DTMF kódů pak RPi přes GPIO sepne relé.

Mám vše hotovo, až na video řešení. Při snaze najít někoho, kdo už problém řešil jsem narazil na mailing list https://www.spinics.net/lists/pjsip/msg20943.html , zde je v podstatě můj problém, no bohužel jsem bez odpovědi.

Po spoustě hodin snažení se o debug jsem bohužel skončil na chybě:

Kód: Vybrat vše

18:11:38.341      sdl_dev.c !SDL_CreateWindow() error: Could not initialize EGL
18:11:38.341      sdl_dev.c !.........Stopping sdl video stream
18:11:38.341     vid_port.c  .........Closing SDL renderer..
18:11:38.341    pjsua_vid.c  .........Window 0: destroying..
18:11:38.341  pjsua_media.c  ......pjsua_vid_channel_update() failed for call_id 0 media 1: Unknown error from video driver (PJMEDIA_EVID_SYSERR)
18:11:38.341    pjsua_vid.c  .......Stopping video stream..
18:11:38.343  pjsua_media.c  .......Media stream call00:1 is destroyed
18:11:38.343  pjsua_media.c  ......Error updating media call00:1: Unknown error from video driver (PJMEDIA_EVID_SYSERR)
A to jen v případě, že nechám připojené HDMI pro výstup, jinak končím na

Kód: Vybrat vše

19:55:56.372    pjsua_vid.c  .......Setting up RX..
19:55:56.372    pjsua_vid.c  ........Creating video window: type=stream, cap_id=-1, rend_id=1480776
19:55:56.372    pjsua_vid.c  .........Window 0: destroying..
19:55:56.372  pjsua_media.c  ......pjsua_vid_channel_update() failed for call_id 0 media 1: Invalid video device (PJMEDIA_EVID_INVDEV)
19:55:56.372    pjsua_vid.c  .......Stopping video stream..
19:55:56.374  pjsua_media.c  .......Media stream call00:1 is destroyed
19:55:56.374  pjsua_media.c  ......Error updating media call00:1: Invalid video device (PJMEDIA_EVID_INVDEV)
Snažil jsem se různými způsoby vyřadit snahu o render videa, nebo vytvořit něco jako dummy screen, který by zahazoval data přijatá, no bohužel bez výsledku.

Přiznám se, že již jsem zoufalý a nedaří se mi najít řešení, tak přicházím sem, jestli tu náhodou nenarazím někoho, kdo má znalost PJSIP, nebo čehokoliv, co mi pomůže s tímto roadblockem, který je snad poslední na cestě k hotovému projektu :? .

Díky!
Uživatelský avatar
xsouku04
Administrátor
Příspěvky: 8160
Registrován: pát 15. říj 2010 11:11:44
Bydliště: Brno
Kontaktovat uživatele:

Re: PJSIP na Raspberry Pi jako Videozvonek

Příspěvek od xsouku04 »

Jestli zvládne RPi zero i vidoe, záleží hodně na tom, jestli bude na video používat hardwarovou akceleraci. Umí ji? A nebo ji dělá již samotná kamera? V jakém kodeku posílá video ta kamera? Nebo ta posílá hodně dat bez komprese? Pokud by kodek uměla dělat samotná kamera, pak jde jen o to to správně propojit a přeposílat pakety.

Bez hardwarové akcelerace předpokládám to výkonově nemá šanci zvládnout.

Kromě výkonu také může být problém s licencemi videokodeků. microsip a android aplikace (např linphone) problém obchází tím, že použijí cizí implementaci, která je v systému již obsazena.

Tedy pokud se něco nezměnilo.

Ale i pokud byste přišel na to, že to prostě takto nelze a dobře to popsal, považoval bych to za úspěch. Pokud byste zvládl dobře rozchodit tu audio část, i to by bylo hodně dobré. Většinou audio stačí.

Výhoda audia je v tom, že je možné hovor nasměrovat třeba na mobil a není třeba mít na druhé straně drahý videotelefon, nebo nespolehlivý sip client pro android.

Pokud bych se chtěl podívat, kdo že to stojí u dveří, řešením by mohlo být se podívat přes webové stránky. Stačilo by mít ikonku a ploše ať už počítače, tabletu nebo android telefonu.


Vemte si, že podobná zařízení stojí více jak 10 tisíc a vy byste to zvládnul poskládat za něco jako 1000 Kč (RPI zero 1)? To je úspěch, kdyby to bylo spolehlivé, dalo by se to opravdu prodávat za několik tisíc Kč, krabičku si nechat hromadně vyrobit v Číně a nebo použít nějakou existující podomítkovou a vyrábět jen přední panel.
simonc
Příspěvky: 7
Registrován: čtv 22. bře 2018 11:28:41

Re: PJSIP na Raspberry Pi jako Videozvonek

Příspěvek od simonc »

Dobrý den,

Pi zero by mělo mít možnost HW encodindu skrze FFMPEG OpenMAX IL H.264 video encoder (codec h264). PJSIP pro svou integraci kamery využívá Video4Linux a právě FFMPEG.

Co se týče kvality videa, půjde hodně dolů, reálně to vidím na max 640x480 na klidně 5FPS, možná i méně.

Návrh na to si obraz poslat bokem jako fotku při zahájení hovoru jsem taky považoval za lepší, bohužel byl zamítnut, že má jít o VOIP hovor s videem..

Aktuálně celý koncept stavím na RPI4, které je značně výkonnější a umožní mi tak případně dokázat, že jsem setup alespoň postavil a rozjel, no preferované zařízení prostě nejde užít pro nedostatek výkonu. Navíc při pokusech s PJSIP knihovnou je nutné ji často překompilovat, což na RPI trvá cca 10-20 minut, na Pi zero doslova 2-3 hodiny.

Dle všeho mi však vychází přímo nějaký problém s využitím PJSIP, protože nedojde k vytížení PI a pokusí validně spojit s videem, ale video funkce jsou ze strany PJSIP zahozeny, protože nedokáže otevřít window pro RX:

Kód: Vybrat vše

9:55:56.372    pjsua_vid.c  .......Setting up RX..
19:55:56.372    pjsua_vid.c  ........Creating video window: type=stream, cap_id=-1, rend_id=1480776
19:55:56.372    pjsua_vid.c  .........Window 0: destroying..
19:55:56.372  pjsua_media.c  ......pjsua_vid_channel_update() failed for call_id 0 media 1: Invalid video device (PJMEDIA_EVID_INVDEV)
19:55:56.372    pjsua_vid.c  .......Stopping video stream..
Vím, že toto je už spíš otázka přímo k PJSIPu, ale stejně se pokusím doptat.

Stejně tak jsem si vědom toho, že stavím řešení, které asi nebude spolehlivé a určitě ne komerčně využitelné. No dostal jsem zadání, tak na něm pracuji.

Věřím však, že mám spolehlivě vyřešeno audio, kdy na Pi běží service se SIP klientem a po stisku tlačítka dojde k hovoru. Ten jde buď na SIP aplikaci, nebo v případě jejího selhání skrze Odorik záložní číslo na mobilní číslo. V obou případech pak funguje příjem DTMF kódů od volaného. Pokud zadá správnou kombinaci a potvrdí ji křížkem, Pi pomocí relé odemkne a zamkne (přes GPIO spustí relé). Proces se pak po ukončení/odmítnutí hovoru vrátí zpět do čekání na stisk tlačítka. Tato část řešení je schopna běhat stabilně, přežije restarty, dočasné pády sítě, nebo odmítnutí hovoru. Je i imunní vůči spamování tlačítka. :) Nyní už jen to video, protože toto na BP nestačí.
Uživatelský avatar
xsouku04
Administrátor
Příspěvky: 8160
Registrován: pát 15. říj 2010 11:11:44
Bydliště: Brno
Kontaktovat uživatele:

Re: PJSIP na Raspberry Pi jako Videozvonek

Příspěvek od xsouku04 »

Myslím, že je dobrý nápad, si to vyzkoušet na něčem mnohem výkonnějším, a až když to funguje, tak to zkusit zpětně dát na to nejlevnější Raspberry.
Pokud je chyba v konfiguraci pjsip, tak by stejná chyba měla vznikat, i pokud to rozchodíte na PC.
Co se týče kompilace, mělo by být možné to croscompilovat na PC (s tím že zadáte aby to bylo pro jiný procesor) a pak to nakopírovat.

Ještě jsem slyšel, že pro podobné účely někdo úspěšné používá knihovny linphone.

Možná by mohlo pomoci se třeba podívat do zdrojáků microsipu nebo podobného programu, pro informace jak lze s tím videeem pracovat. Já bych se v tom ale nevyznal.

Já ale žádnou zkušenost s vývojem SIP klientů nemám. A bohužel o programování v C nebo C++ toho také moc nevím. Jaký jazyk používáte?

Jak kvalitní máte zvuk? Vzniká tam ozvěna?
Napadlo RP umístit někde dovnitř do tepla (stačilo by kousek za dveře) a stabilnější teploty, a do dveřníku ven táhnout jen mikrofon, reproduktor, tlačítko a možná kameru. By to pak celé mohlo být výrazně menší a placatější. Jen taková nálepka s tlačítkem. :)
Při nejhorším by kamera mohla být zvláštní zařízení, které by mohlo být třeba i někde u stropu. Přesto by mělo být možné to celé sestavit jako jeden VoIP hovor. Tedy kdyby se opravdu ukázalo, že RPi na to nestačí. Nízké rozlišení videohovoru je dostatečné.
simonc
Příspěvky: 7
Registrován: čtv 22. bře 2018 11:28:41

Re: PJSIP na Raspberry Pi jako Videozvonek

Příspěvek od simonc »

Zdravím!

Asi jsem pár věcí nepopsal jasně, tak to zkusím doopravit.

Přesně jak píšete, pro testování a kompilaci používám Raspberry Pi 4 3GB, kde mám dost výkonu a pořád se držím na platformě a můžu užívat stejné HW doplňky. I kompilace je zde v rámci minut a tak je možné testovat FLAGy.


Knihovna PJSIP je bohužel zvolená školou a navíc vzhledem k času do odevzdání asi nemohu změnit celou knihovnu.

Zkusím na microsip kouknout. ALe nejsem taky primárně vývojář, takže nevím, jestli tam něco vyčtu :) .

Knihovna je skutečně C, ale používám nadstsavbu PJSUA2, takže můj software je v Pythonu 3.

Co se týče zvuku, není to špatně. Žádné HiFi, ani super mobilní HD hovor, ale vzhledem k velikosti reproduktoru a mikrofonu na RPI to jde použít. Potlačení ozvěny je na PJSIP velmi agresivní, ale kupodivu jim to vcelku funguje, takže pokud je volající alespoň v jiné místnosti, je to cajk. Ozvěna mezi mikrofonem/reproduktorem kupodivu není problém.

Myslím, že můj projekt nikdy neskončí mimo můj stůl a skříň fakulty, takže teploty se asi nebojím :) Chápu, že by tím šlo obejít problémy s velikostí Pi zero vs Full Pi, ale obávám se, že to neprojde. Ale dobrý nápad! :D Ona by ani ta krabička s PI4 nebyla o tolik větší, ale bohužel se prostě nelíbí.

Nakonec se mi povedlo, byť za šílenou cenu 2700 (místo původní MSRP 420) zajistit Pi Zero 2, které má alespoň 3 vlákna procesoru a bude tak mít alespoň šanci nějaké video vyloudit.

No jak jsem se snažil popsat výše, výkon je teď asi druhořadý problém a bojuji teď asi se samotnou knihovnou a její snahou zobrazovat data i bez displeje.


Procházel jsem dokumentaci PJSIP a snažil se něco vymyslet a potkal jsem tuto funkci: https://www.pjsip.org/pjsip/docs/html/g ... 833f2a0672 Bohužel jsem prostě moc demento-vývojář na to, abych ji dokázal do svého python kódu implementovat. ALe dle jejího popisu jsem pochopil, že by měla být schopna spustit outgoing video i po selhání prvního pokusu, kde je i snaha otevřít příchozí video.


Případně jsem pak přemýšlel, jak situaci obejít. Pomohlo by donutit setup, aby se otevřel video pouze jednosměrně. Případně nenapadá Vás nějaký SIP klient na Win, který by mi umožnil neposílat video, ale video přijímat? Případně, nejde nějak na straně SIP serveru mezi zařízeními prostě upravit komunikaci tak, aby se spustil jednostranný videohovor?

Snažil jsem se vymyslet, jak tu komunikaci upravit na straně klientů, ale selhal jsem. Tu komunikaci si prostě řídí klienti sami a já jim jen můžu povolit/zakázat kodeky a případně deaktivovat celou videofunkcionalitu.

Omlouvám se, jestli píšu blbosti, i SIP znám spíše z užití při nasazení VOIP telefonie v malé firmě a mám nastudované protokol na úrovni studenta VŠ, co chce projít + něco navíc, když jsem začínal na BP. :)
alfi
Příspěvky: 721
Registrován: čtv 03. led 2013 15:31:10

Re: PJSIP na Raspberry Pi jako Videozvonek

Příspěvek od alfi »

Samotné Pi Zero video utáhne, má konektor pro kameru a třeba MotionEye + originál Pi kamera funguje i ve fullHD. Zadrhávat začne až při pokusu o detekci pohybu v obraze, kterou dělá CPU.
PJSIP bohužel neznám. Nemůže být problém v tom, že očekává video provoz obousměrně a když jeden chybí, tak stávkuje?
simonc
Příspěvky: 7
Registrován: čtv 22. bře 2018 11:28:41

Re: PJSIP na Raspberry Pi jako Videozvonek

Příspěvek od simonc »

Jak se snažím popsat výše, problém je s tím, že se PSJIP snaží otevřít videostream od druhé strany, ale protože nemá displej..a protože prostě nevím co něco s SDL..se mu to nepodaří, tak se vykašle na jakékoliv videověci a fallbackne jen na audio.

U RPI Zero je problém procesovat audio/video hovor dohromady, narozdíl od záznamu totiž řeší věci jako echo cancellation a udržení samotného hovoru. Výkonově je tam tedy skutečně problém. Mám však sehnané Zero 2, kde by problémy nastat neměly.

Můj aktuální boj je ale právě PJSIP a jeho problémy s RX videem.
Uživatelský avatar
xsouku04
Administrátor
Příspěvky: 8160
Registrován: pát 15. říj 2010 11:11:44
Bydliště: Brno
Kontaktovat uživatele:

Re: PJSIP na Raspberry Pi jako Videozvonek

Příspěvek od xsouku04 »

Knihovnu pjsip jsem nikdy nepoužíval a cca 20 let jsem nedělal nic v jazyku C. Ale našel jsem tohle.

https://docs.pjsip.org/en/latest/specif ... video-call


Controlling Incoming Video Stream

PJSUA_CALL_VID_STRM_CHANGE_DIR: change the media direction (e.g. to “sendonly”, or even “inactive”)
Napadá mne také možnost udělat nejdříve jen audio hovor a poté se dodatečně pokusit přidat video, pokud to druhá strana akceptuje. To lze udělat tím re-INVITE.
Uživatelský avatar
xsouku04
Administrátor
Příspěvky: 8160
Registrován: pát 15. říj 2010 11:11:44
Bydliště: Brno
Kontaktovat uživatele:

Re: PJSIP na Raspberry Pi jako Videozvonek

Příspěvek od xsouku04 »

Zdravím. Zadařilo se?
simonc
Příspěvky: 7
Registrován: čtv 22. bře 2018 11:28:41

Re: PJSIP na Raspberry Pi jako Videozvonek

Příspěvek od simonc »

Zdravím,

Můj video úspěch je celý jeden přenesený frame videa, než se celý hovor rozpadl. Co je vtipnější, ani ten jeden snímek na začátku už se mi nikdy nepodařilo replikovat.

Problém byl na několik frontách:
  • Většina SIP klientů vyžaduje video alespoň 5 FPS v rozlišení VGA.
  • Vyžadovaného framratu nešlo dosáhnout, protože PJSIP nemá jasně popsáno, jak pro encode použít nějaký kodek s HW akcelerací (jde buildnout s FFMPEG, ale využití jeho kodeků už ne)
  • Knihovna je v tétot verzi s videem nestabilní. Házela doslova náhodně chyby. Sotva jsem něco rozjel, přišel jsem další den ráno a bez zásahu do kódu už to nejelo a házelo jiné chyby :D
Nakonec jsem tedy dosáhl dohody s vedoucím práce, že po SIP pošleme pouze audio a DTMF a video si pošlu zvlášť, jako MPEG stream. Je to totiž dle mého nejen stabilnější, ale i uživatelsky lepší řešení.

Videostream si totiž pošlu do HomeAssistenta (https://www.home-assistant.io/) a udělám i integraci remote GPIO. Tím budu moci využít zvonek jako kameru a ovládat dveře (relé) a koukat na obraz nezávisle na hovoru.

Díky napojení do HA se pak dá v budoucnu uvažovat o větší automatizaci, využití AI pro detekce obličejů a podobně.

Největší výhodou a vůbec zajištění proveditelnosti tohoto řešení ale možnost ten stream encodovat RPI GPU čipem a výrazně tak šetřit CPU pro hovory.

Nejhorší na tom bylo, že sotva jsme se na tomto s vedoucím dohodli, PJSIP se začal mstít a přestalo fungovat i audio :D . Udělal jsem tedy čistou instalaci, novou kompilaci bez video supportu a přesně dle mé semestrální práce, kde vše fungovalo stabilně. No a při spuštění hovoru byl s reproduktoru slyšet je statický zvuk. Problém byl nakonec v ALSA/PJSIP komunikaci, kdy se hádali o počet kanálů a sample rate. https://photos.app.goo.gl/v6TBAT5ujRaszjt69

Nyní už mi tedy alespoň audio řešení zvonku (a odemykání DTMF kódy) jede jako služba v linuxu a dávám dohromady service verzi toho video přenosu. Při testech se mi podařilo udělat proof of concept tohoto řešení a RPI 4, nyní to vše zkouším "načisto" na RPI Zero 2W.

Pokud je zájem, budu informovat, jak jsem dopadl i s tím :).
Odpovědět