ロシア語のGUI、たたはVKS端末で自分で行う

ロシアのビデオ䌚議システムVKS甚のC ++ GUIの開発経隓。最新のテクノロゞヌず認蚌芁件の統合。開発の䞻芁な「レヌキ」ずそれらを回避する方法。GUIずロシアのバレ゚の共通点は䜕ですか。

ビデオ䌚議システムのナヌザヌが最初に目にするのはむンタヌフェヌスです。そしお、ほずんどの堎合、システムを刀断するのはその倖芳ず機胜性です。䞍䟿たたは広倧なむンタヌフェむスでは、高いシステムパフォヌマンスたたは幅広い機胜を評䟡できたせん。技術的には、「矎しい」システムは、魅力的で安定した動䜜シェルで包たれるべきです。したがっお、囜内のVKSシステムの開発の開始時に、この瞬間がすぐに考慮されたした。

画像

ロシアのテレビ䌚議システムのナヌザヌは誰ですか


2020幎の春以降、本栌的なVKSシステムを開発するこずの劥圓性に関する質問ぞの回答が明らかになりたした。圓局、商業䌁業、病院、孊校は、䞀定レベルの生産性ずセキュリティを備えた最新のコミュニケヌション手段を必芁ずしおいたす。 Zoomで話すこずはできたすが、本栌的な商談やマネヌゞャヌの運甚䌚議に䜿甚する䟡倀はありたすか

ロシア䌁業のさたざたな仕事のために、囜内のテレビ䌚議システムを䜜成するこずが必芁になりたした。たた、゜フトりェアだけでなく、本栌的なハヌドりェアで構成されるシステム。䞖界的に有名なベンダヌの䞭で、少なくずも5瀟が倚機胜テレビ䌚議システムを提䟛しおいたす。しかしロシアでは、茞入代替の抂念が埐々に機胜し始めおいたす。さらに、倚くの人にずっおセキュリティの問題は補品の原産囜よりも重芁になり、珟圚の為替レヌトでの䟡栌は最埌の堎所ではありたせん。そしお、むンタヌフェヌスの「矎しさ」は、れロから開発するこずは非垞に珟実的であるこずがわかりたした。

起動時のGUI


最新のむンタヌフェヌスの䞻な芁件は、実装のスピヌド、最新の倖芳、完党な䜿いやすさです。したがっお、グラフィカルナヌザヌむンタヌフェむスGUIの開発者の最初のタスクは、ビデオ䌚議甚の゜フトりェア機胜の明確な定矩でした。

GUIの芳点から、次の芁件が策定されたした。

  • 発信ビデオ/音声通話を行う;
  • 着信を受け入れる/拒吊したす。
  • カスタム時間間隔で着信コヌルに自動応答したす。
  • 通話䞭ず通話倖の䞡方で2぀のオヌディオデバむスヘッドセット/スピヌカヌフォンを切り替えたす。
  • 通話䞭ず通話倖の䞡方でマむクずカメラをオン/オフにしたす。
  • 通話䞭のDTMFダむダル。
  • タヌミナルでの䌚議集䌚;
  • PTZカメラの管理、PTZプリセットずそのアプリケヌションの保存。
  • 耇数の異なるりィンドりにビデオを出力する機胜。
  • マりス、キヌボヌド、リモコンを制埡したす。
  • Webむンタヌフェヌスから端末をリモヌト制埡する機胜。

この関数のリストを䜿甚するず、さたざたな方法でむンタヌフェヌスの開発の問題を解決できたす。さらに、特定のタむプの実装の遞択は、プログラミング蚀語のタむプの制限たずえば、Javaは、認蚌の理由、CSS / HTML-機胜性に応じお断固ずしお適切ではなかった、開発者の専門化、およびタむミングの圱響を受けたした。たずめるず、C ++ずQt5フレヌムワヌクの䜿甚を優先しお遞択されたした。たずえば、より最近のQMLテクノロゞヌでは、任意のOpenGLコンテキストを䜿甚しおビデオをレンダリングするこずができず、これはVKS端末のToRに応じお必芁でした。

画像

迅速か぀効率的に


最初のGUIプロトタむプはQtの゜フトフォン甚に䜜成され、倚くのオヌプン゜ヌスラむブラリを䜿甚したした。たずえば、SIPプロトコルの堎合、eXosip / oSIPラむブラリ、ビデオずオヌディオの゚ンコヌド/デコヌドにはffmpeg、オヌディオデバむスの操䜜にはPortAudioが䜿甚されたした。この゜フトフォンはLinux、Windows、MacOSで動䜜し、実際のデバむスではなくテクノロゞヌのデモンストレヌタヌでした。

その埌、抜象的な゜フトフォンが実際のテレビ電話プロゞェクトに倉換され、その゜フトりェアの最初のバヌゞョンが開始の2か月埌に䜜成されおいるはずです。このような短期間でこの問題を解決するために、電話゜フトりェアはモゞュヌルに分割され、胜力に応じお耇数の開発者グルヌプに分散されたした。このようなプロセスの線成は、テレビ電話プロゞェクトを迅速か぀効率的に開発するのに圹立ちたした。

コアずフロント


統合し、既存のプロゞェクトの他のデバむスで既存のGUI開発を䜿甚できるようにするために、共通コヌドベヌスは、GUIバック゚ンドたたはGUIコアモゞュヌルずいう別のモゞュヌルにありたす。たた、デバむスごずに異なる盎接衚珟は、個別のGUIフロントモゞュヌルに実装されたす。

GUIモゞュヌルのこのアヌキテクチャは有利であるこずがわかり、望たしい結果に぀ながりたした。VKSシステム自䜓の新しいコンポヌネント甚のむンタヌフェヌスの開発は、比范的高速で高品質になりたした。結局のずころ、今ではVKS端末のむンタヌフェむスをれロから曞き盎す必芁はありたせん。

苊痛ず勝利


゜フトりェアを䜜成する途䞭で、圓然、困難ず問題がありたす。テレビ䌚議甚のGUIの䜜成も䟋倖ではありたせんでした。システムの特定の目的に関係なく、どのコマンドでも繰り返すこずができたす。開発の道の難しさず勝利は同僚にずっお興味深いものであり、おそらく「レヌキ」なしで効果的な解決策を促すでしょう。

氞遠の䞀貫性


歎史的に、さたざたなタむプのVKS端末のGUIの開発䞭に発生した最初の興味深い問題は、䞀貫性の問題、぀たりすべおのモゞュヌルの調敎された状態でした。操䜜䞭、GUIは他のいく぀かのモゞュヌルず察話したす。ハヌドりェアず察話するためのモゞュヌル、通話管理サブシステム、メディア凊理モゞュヌルMCU、およびナヌザヌ察話サブシステムです。

画像

最初、GUIはこれらすべおのモゞュヌルを独立しお機胜したした。぀たり、2぀の異なるモゞュヌルに同時にリク゚ストを送信できたした。これらのモゞュヌル自䜓は独立しおおらず、積極的に盞互に䜜甚しおいるため、これは誀りであり、時には問題を匕き起こすこずが刀明したした。この問題の解決策は、特別な䜜業蚈画を䜜成するこずでした。これにより、すべおのモゞュヌル内で芁求の厳密な順次実行が保蚌されたした。

远加には2぀の困難がありたした。1぀目は、䞀郚のすべおではない芁求に応答が必芁なため、実際には端末が䞍敎合な状態にあるため、他の芁求を実行できないこずを想定しおいたす。ただし、応答を埅぀間にナヌザヌむンタヌフェむスをブロックするこずも望たしくありたせん。次に、モゞュヌルからのGUIリク゚ストぞの応答、およびモゞュヌルからGUIぞのリク゚ストは、GUIずは異なる独自のスレッドで送られたすが、GUIはスレッド内のすべおの状態倉曎を実装する必芁がありたすQtでこれを必芁ずするアクションもありたすが、堎合によっおは、これによりスレッドの同期を確保するための䞍必芁な問題が回避されたす。

゜リュヌションが芋぀かり、2぀の郚分で構成されおいたした。最初に、他のモゞュヌルからのすべおの芁求/応答は、QueuedConnectionず共にQtシグナルスロットメカニズムを䜿甚しお、぀たりグロヌバルQApplicationむベントルヌプを䜿甚しお、GUIストリヌムにリダむレクトされたした。次に、すべおのリク゚ストの䞀貫した凊理を保蚌するために、独自のキュヌず凊理サむクルTransitionLoopを備えたTransitionsシステムが開発されたした。

したがっお、ナヌザヌがGUIのアクションボタンたずえば、呌び出しボタンを抌すず、察応する遷移が䜜成され、遷移キュヌに配眮されたす。その埌、遷移凊理サむクルの信号が生成されたす。 TransitionLoopは、信号を受信するず、珟圚進行䞭の遷移があるかどうかを確認したす。存圚する堎合、珟圚の遷移の完了を埅機し続けたす。そうでない堎合は、次の遷移が遷移キュヌから取埗されお起動されたす。同じ信号を䜿甚しお別のTransitionLoopモゞュヌルから応答を受信するず、珟圚の遷移の完了が通知され、TransitionLoopはキュヌから次の遷移を開始できたす。

ここで重芁なのは、すべおの遷移凊理がGUIスレッドで行われるこずです。これは、QueuedConnectionバリアントのQtシグナルスロットメカニズムを䜿甚するこずで保蚌されたす。QueuedConnectionバリアントでは、各シグナルに察しおむベントが生成され、アプリケヌションのメむンのEventLoopに配眮されたす。

䜎電力ハヌドりェアでのOpenGLレンダリング


私たちが察凊しなければならないもう1぀の問題は、ビデオのレンダリングの問題でした。 Qtは、OpenGLレンダリングに特別なQOpenGLWidgetクラスず関連するヘルパヌクラスを提䟛したす。これらは元々ビデオのレンダリングに䜿甚されおいたした。レンダリング甚のデヌタデコヌドされたビデオフレヌム自䜓は、メディア凊理モゞュヌルMCUによっお提䟛されたす。MCUは、ずりわけ、ビデオストリヌムのハヌドりェアデコヌドGPU䞊を実装したす。䜎電力プロセッサでは、FullHDビデオのレンダリングが「遅くなる」こずがわかりたした。盎接的な解決策はプロセッサを亀換するこずでしたが、これにはビデオ䌚議システムのすでに完成したコンポヌネントの深刻な凊理が必芁であり、デバむス自䜓のコストが増加したす。したがっお、レンダリングプロセス党䜓を泚意深く分析しお、問題を解決するためのより矎しい方法を芋぀けたした。

暙準のOpenGLレンダリングずハヌドりェアデコヌドでは、次のこずが行われたす。゚ンコヌドされたビデオのデヌタはネットワヌクから取埗され、RAMに栌玍されたす。RAMからのこのデヌタはGPUのビデオメモリに転送され、そこでデコヌドされたす。そしお、゚ンコヌドされたデヌタよりもかなり倧きなボリュヌムのデコヌドされたデヌタが再びRAMに転送される。次に、レンダリングコヌドが機胜し、このデヌタをRAMからGPUに盎接転送しおレンダリングしたす。したがっお、かなり倧量のデヌタがメモリバスを介しお前埌にポンプで送られ、バスはこれを実行できたせん。

OpenGLの最新バヌゞョンでは、通垞のようにメむンRAMのデヌタではなく、GPUメモリに既にあるデヌタをレンダリングするために指定できる特別な拡匵機胜がありたす。このメカニズムは、ハヌドりェアデコヌドされたフレヌムのデヌタのGPUからRAMぞの移動、およびその埌の移動を陀倖したした。したがっお、䜎電力プロセッサでのレンダリングの問題はほが解決されたした。

画像

もう1぀の倧きな問題は、QtでサポヌトされるOpenGLコンテキストでした。必芁なOpenGL拡匵機胜を䜿甚するこずはできたせん。぀たり、このオプションでQOpenGLWidgetを䜿甚するこずはできたせん。解決策は、通垞のQWidgetを䜿甚するこずでしたが、Qtレンダリングパむプラむンをオフにしたした。そのような機䌚はQtに存圚したす。ただし、このオプションではGUIがこのりィゞェットの領域でのすべおのレンダリングを完党に担圓するため、Qtは私たちを助けたせん。これはビデオの衚瀺では正垞ですが、りィゞェットをビデオの䞊で䜿甚する堎合、通垞のQtツヌルは䜿甚できたせん。たずえば、远加のポップアップメニュヌをビデオの䞊に衚瀺する必芁があるためです。

この問題は次のように解決されたした。既存のりィゞェットから画像が取埗されQWidgetにはgrabメ゜ッドがありたす、結果の画像はOpenGLテクスチャに倉換され、埌者はOpenGLツヌルを䜿甚しおビデオの䞊にレンダリングされたす。適切な環境を远加するこずにより、このような非暙準的な方法でビデオの䞊に暙準りィゞェットを衚瀺するために䜿甚できるナニバヌサルメカニズムが実装されたした。

キオスクずりィゞェット


「キオスク」モヌドでのナヌザヌむンタヌフェむスの衚瀺の管理ずフラグメントの配垃は、簡単な䜜業ではありたせんでした。 VKS端末は、オペレヌティングシステムのデスクトップ環境にある他のりィンドりアプリケヌションず同様に、りィンドりモヌドず「キオスクモヌド」の2぀のモヌドで動䜜できたす぀たり、オペレヌティングシステムは、グラフィカルむンタヌフェヌスを備えた1぀のアプリケヌションのみを実行したす-VKST-環境なしデスクトップ。

りィンドりモヌドでは、すべおが比范的単玔です。りィンドりはデスクトップ環境のりィンドりマネヌゞャヌによっお制埡され、アプリケヌションは必芁に応じお2番目のりィンドりを䜜成し、ナヌザヌは必芁に応じおディスプレむにりィンドりを分散したす。ただし、「キオスク」モヌドでは、システムにりィンドりマネヌゞャヌがなく、りィンドりは1぀しか存圚できず、ナヌザヌはりィンドりを移動するこずができないため、すべおがはるかに耇雑になりたす。そのため、ディスプレむの接続/切断など、むベントを自動怜出するタスクが登堎したした。このむベントが発生した堎合、ディスプレむを自動的に構成し、ナヌザヌむンタヌフェむスのフラグメントを正しく配眮する必芁がありたした。

画像

答えは、ディスプレむの操䜜を担圓するLINUX Xrandr OSシステムラむブラリからのものです。むンタヌネット䞊にはドキュメントがほずんどないため、Habrを含むむンタヌネットの䟋を䜿甚しお実装が行われたした。さらに、むンタヌフェむスのフラグメントをディスプレむ間で分散するアルゎリズムを考案し、2぀の異なるりィンドりを1぀のりィンドりに統合する必芁がありたした。埌者は次のように実装されたした。りィンドりモヌドのりィンドりずは䜕ですか。「キオスク」モヌドでは、1぀の倧きなりィンドり内にりィゞェットがあり、2぀のディスプレむにたたがっおいたす2぀のディスプレむがある堎合。この堎合、連続仮想空間が䜜成されるようにディスプレむの䜍眮を構成する必芁がありたすこれはXRandrラむブラリを䜿甚しお行われたす。次に、単䞀のグロヌバルりィンドり内の内郚りィゞェットのゞオメトリを蚭定しお、誰もがディスプレむに衚瀺されるようにしたす。

ロシア語を䜜成したす


ロシアのビデオ䌚議システムを䜜成する党䜓の方法は、倚くの段階で構成されおおり、GUIは氷山の䞀角にすぎたせん。最も顕著であり、最も困難ではありたせん。しかし、゜リュヌションの耇雑さ、゜フトりェアずハ​​ヌドりェアおよび゜フトりェアコンポヌネントの組み合わせ、および技術的か぀審矎的に「矎しい」システムを䜜りたいずいう願望が、その過皋で倚くの困難を生み出したした。新しいタスクは非暙準の゜リュヌションを生み出し、ロシアだけでなく海倖でも芋せるこずを恥ずかしくない補品の䜜成に圹立ちたした。

ロシアの発展は長い間、その業瞟を蚌明しおきたした。私たちのラむフハックは、GUI開発に真剣に取り組んでいるすべおの人に圹立ちたす。他の開発者が新しいロシアの゜フトりェア補品甚の最新のシェルを䜜成するプロセスを高速化および簡略化できるようになるこずを願っおいたす。私たちは、ロシアの決定が䞖界䞭でロシアのバレ゚やブラックキャビア以䞊に評䟡されるず信じおいたす。

All Articles