Toxメッセンゞャヌのオヌディオずビデオ

むンスタントメッセンゞャヌの芏制を怜蚎しおいる人もいれば、分散型むンスタントメッセンゞャヌを開発しおいる人もいたす。 以前の出版物では、単玔な゚コヌボットを䜜成する䟋を䜿甚しお、ToxメッセンゞャヌカヌネルAPIの䜿甚が怜蚎されたした。 Toxの開発はただ止たっおおらず、11月3日にToxコアはオヌディオおよびビデオコヌルの新しいサブシステムであるToxAVで匷化されたした。これに぀いおは、この出版物で説明したす。



画像





はじめに



ToxAVは、オヌディオ甚のOpusコヌデックずビデオ甚のVP8 、およびそれぞれlibopus ラむブラリずlibvpxラむブラリでの実装に基づいおいたす 。



ToxAV APIは、オヌディオの入力および出力圢匏ずしお、16ビットサンプリング、1たたは2チャネルのサポヌト、8、12、16、24、48 KHzのサンプリング呚波数を備えたPCM圢匏を䜿甚したす。 1぀のデヌタフレヌムの期間は、2.5、5、10、20、40、たたは60ミリ秒である必芁がありたすopusコヌデックの芁件。



ToxAV APIは、ビデオの入力および出力圢匏ずしお、YUV420圢匏IYUVおよびI420ずも呌ばれたすのフレヌムを䜿甚したす。これは、より䜿い慣れたRGB色空間に比范的簡単に倉換できたす。



ToxAVは、オヌディオデバむスやビデオデバむスからデヌタをキャプチャしたり、再生したりする方法を提䟛したせん。これらはすべお、アプリケヌション開発者の裁量に任されおいたす。 したがっお、たずえば、 µToxクラむアントは、オヌディオの操䜜にOpenALを䜿甚し、ビデオデバむスの操䜜にv4l video4Linuxを䜿甚したす。 QToxクラむアントは、 FFmpegを䜿甚しおビデオを凊理したす。 Python以䞋で間接的に説明したす では 、オヌディオにPyAudioを、ビデオにOpenCVを䜿甚できたす。



ToxAVの䞀般的な䜜業サむクルは、次の圢匏で順番に衚すこずができたす。



  1. ToxCoreカヌネルの初期化 以前の出版物で詳现に説明されおいたす。
  2. ToxAVサブシステムの初期化 toxav_new 。
  3. むベント凊理のためのコヌルバック関数の蚭定 toxav_callback_ * -むベントハンドラヌはメむンルヌプから呌び出され4、アプリケヌションのメむンロゞックは通垞それらに集䞭したす。
  4. メむンデュヌティサむクル toxav_iterate およびむベント凊理。
  5. toxav_iteration_intervalを䞀時停止し、前の手順に戻りたす。


なぜなら Tox APIの知識を埗るための䞻な方法は、゜ヌスコヌドCで蚘述を読むこずです。さらにプレれンテヌションを単玔化するために、Python蚀語のラッパヌ githubのpytoxcore を䜿甚したす。 ゜ヌスからラむブラリの自己アセンブリを行いたくない人のために、䞀般的なディストリビュヌション甚の既補のバむナリパッケヌゞぞのリンクもありたす。



Pythonラッパヌを䜿甚する堎合、次の方法でラむブラリのヘルプを取埗できたす。



$ python >>> from pytoxcore import ToxAV >>> help(ToxAV) class ToxAV(object) | ToxAV object ... | toxav_answer(...) | toxav_answer(friend_number, audio_bit_rate, video_bit_rate) | Accept an incoming call. | If answering fails for any reason, the call will still be pending and it is possible to try and answer it later. Audio and video receiving are both enabled by default. | | toxav_audio_receive_frame_cb(...) | toxav_audio_receive_frame_cb(friend_number, pcm, sample_count, channels, sampling_rate) | This event is triggered when a audio data received. ...
      
      





以䞋では、APIを操䜜する各ステップに぀いおもう少し詳しく説明したす。



ToxAVの初期化



ToxAVサブシステムを初期化するために、以前に初期化されたToxCoreカヌネルのむンスタンスが呌び出しパラメヌタヌtoxav_newずしお䜿甚されたす。 単䞀のToxCoreむンスタンスに察しお䜜成できるToxAVむンスタンスは1぀だけです。 Pythonラッパヌでは、toxav_new呌び出しはコンストラクタヌ内に隠されおおり、初期化は次のようになりたす。



 from pytoxcore import ToxCore, ToxAV class EchoBot(ToxCore): ... class EchoAVBot(ToxAV): def __init__(self, core): super(EchoAVBot, self).__init__(core) ... bot = EchoBot(options) botav = EchoAVBot(bot)
      
      





ToxAVむンスタンスを砎棄するには、 toxav_kill呌び出しを䜿甚するか、Pythonラッパヌのクラスむンスタンスを砎棄したす。この堎合、toxav_kill呌び出しはデストラクタに隠されおいたす。



コヌルバック関数を蚭定する



Pythonラッパヌでは、サポヌトされおいるコヌルバック関数ぞの接続が自動的に行われたす。 ハンドラヌ自䜓はToxAVの子孫のメ゜ッドであり、サフィックス* _cbを持぀こずができたす。 すべおのハンドラヌで、パラメヌタヌの1぀はfriend_number-同様のToxCoreメ゜ッドからの友人の敎数識別子です。



toxav_call_cbfriend_number、audio_enabled、video_enabled -着信コヌル。 匕数ずしお、コンタクト偎からのオヌディオずビデオをサポヌトするためのフラグが远加で枡されたす。 将来、ミュヌトされたオヌディオたたはビデオストリヌムずの接觊により、それらがオンになり、むベントによっおコヌルステヌタスが倉曎される可胜性がありたす。 呌び出しは、呌び出しtoxav_answerで受信するか、呌び出しtoxav_call_controlで拒吊できたす。



toxav_call_state_cbfriend_number、state -通話状態を倉曎したす。 状態は、定数のビットマスクであり、匕数ずしお枡されたす。





toxav_bit_rate_status_cbfriend_number、audio_bit_rate、video_bit_rate -カヌネルが必芁なビットレヌトでデヌタを送信できない堎合のネットワヌク茻茳むベント。 パラメヌタずしお、カヌネルはオヌディオおよびビデオストリヌムの新しいビットレヌトを提䟛したす。 さらに、カヌネルは最初にメむンレヌンを占有するため、ビデオストリヌムのビットレヌトを䜎䞋させようずしたす。ビデオストリヌムを切断した埌にのみ、オヌディオのビットレヌトを䜎䞋させようずしたす。 アプリケヌションはこれらの掚奚事項を無芖するか、 xav_bit_rate_setfriend_number、audio_bit_rate、video_bit_rateの呌び出しを䜿甚しお新しいビットレヌトを蚭定できたす。 ビットレヌトはKb / sキロビット/秒で蚭定され、倀0は察応するデヌタストリヌムのシャットダりンを瀺し、倀-1は以前の蚭定ビットレヌトを倉曎したせん。



opusオヌディオコヌデックの堎合、最小ビットレヌトは6で、私の耳の16〜32を超える倀は、Webカメラからの音で区別できなくなりたした。



V8ビデオコヌデックの堎合、フレヌムサむズずFPSによっおは掚奚垯域幅倀が芋぀かりたせんでした。 䞀般に、さたざたなビデオ解像床に察しお次の基本ビットレヌトが掚奚されたす。

フレヌムサむズ、px ビットレヌト、Kb / s
320x240 400
480x270 700
1024x576 1500
1280x720 2500
1920x1080 4000


toxav_audio_receive_frame_cbfriend_number、pcm、sample_count、channels、sampling_rate -オヌディオデヌタのフレヌムを受信したす。 デヌタバッファ、サンプル数、チャネル数、サンプリング呚波数Hzがパラメヌタヌずしお送信されたす。 ステレオサりンドの堎合、16ビットのサンプルは、巊右のチャンネルで次々に順番に送信されたす。 バむト単䜍のバッファヌのサむズは、 sample_count * channels * 2バむトずしお定矩され、ミリ秒単䜍のバッファヌの持続時間は、 sampling_rate / sample_countずしお定矩されたす。



PCMは埓来のパルスコヌド倉調圢匏であるため、バッファヌデヌタは、DACに倉換せずに実質的に転送するか、圢匏の説明を含む適切なヘッダヌを远加するこずでWAVファむルに保存できたすが、䌚話䞭にオヌディオストリヌムパラメヌタヌを準備する必芁がありたす呌び出し元によっお倉曎されたす。



toxav_video_receive_frame_cbfriend_number、幅、高さ、y、u、v、ystride、ustride、vstride -YUV420圢匏のビデオデヌタのフレヌムを受信したす。 これはToxAVからの元のコヌルバックです。 YUV420からBGRぞの倉換の実装䟋は、たずえばΌTox゜ヌスコヌド yuv420tobgr にありたす。



toxav_video_receive_frame_cbfriend_number、width、height、rgb-RGBたたはBGR圢匏でフレヌムを受信するこずは、ToxAVでは利甚できない远加のPythonラッパヌコヌルバックです。 このオプションは、pyhonに倉換するのではなく、ラむブラリ内で必芁な倉換を高速化するために䜿甚されたす実際、µToxコヌドのyuv420tobgrが䜿甚されたす。 RGBたたはBGR圢匏を蚭定するには、パラメヌタヌを指定しおtoxav_video_frame_format_setを呌び出したす。





以䞋、RGB / BGRは、アルファチャネルのない24ビット圢匏を指し、赀、緑、青の各コンポヌネントには8ビットが割り圓おられたす。 この圢匏は、赀ず青の色成分の順序に応じお、RGB24 / BGR24ず呌ばれるこずもありたす。



オヌディオストリヌムず同様に、ビデオストリヌムの圢匏は、発信者がい぀でも倉曎できたすたずえば、フレヌムサむズが倉曎されたす。



むベント凊理



Toxavむベントは、 toxav_iteration_interval呌び出しを返す倀ず等しい呌び出し間の掚奚間隔 tox_iteration_intervalカヌネルの呌び出しに類䌌でtoxav_iterateメ゜ッドを定期的に呌び出しお tox_iterateカヌネルメ゜ッドの呌び出しに類䌌凊理されたす。



ToxAVのデュヌティサむクルは、次のように別のスレッドで提䟛するこずをお勧めしたす。 オヌディオ/ビデオコヌルがない堎合、 toxav_iteration_intervalの倀は200ミリ秒になり、ストリヌムはほずんどの時間スリヌプしたす。



 import threading class EchoAVBot(ToxAV): def __init__(self, core): ... self.running = True self.iterate_thread = threading.Thread(target = self.iterate_cb) self.iterate_thread.start() def iterate_cb(self): while self.running: self.toxav_iterate() interval = self.toxav_iteration_interval() time.sleep(float(interval) / 1000.0) def stop(self): self.running = False self.iterate_thread.join() self.toxav_kill();
      
      





GILGlobal Interpreter LockはPythonに存圚するため、スレッド間の同期の必芁性に぀いお心配する必芁はありたせんが、他の蚀語ではtox av _ * _ cbむベントがtox_iterateを提䟛するスレッドから呌び出されるず「予期しない」驚きがありたすフロヌサヌビングトックスav _iterate。 たずえば、このようなむベントはtoxav_call_state_cb呌び出し完了むベントです。Toxカヌネル内でのデッドロックの可胜性を考慮しお、適切な同期プリミティブを䜿甚したす。



通話管理



発信コヌルを䜜成するには、 toxav_callメ゜ッドfriend_number、audio_bit_rate、video_bit_rateを䜿甚したす 。ここで、連絡先リストの連絡先識別子ず発信オヌディオおよびビデオビットレヌトKb / sが匕数ずしお指定されたす。 ビットレヌト倀0は、察応するストリヌムの送信をブロックしたす。これは、 toxav_bit_rate_setを呌び出すこずで埌で有効にできたす。



ToxAVには通垞の呌び出し制埡がありたせん-受け入れられない発信呌び出しは、アプリケヌション自䜓の内郚タむムアりトによっお呌び出しがキャンセルされるアプリケヌションがハングアップするか、連絡先がオフラむンになりたせんネットワヌク切断ずtoxav_call_state_cbむベントパラメヌタTOXAV_FRIEND_CALL_STATE_FINISHED 。 デフォルトでは、連絡先からのオヌディオおよびビデオデヌタの受信は有効になっおおり、 toxav_call_controlを呌び出すこずで倉曎できたす。



着信呌び出しはtoxav_call_cbむベントによっお決定され、その埌、呌び出しは完党に無芖されるか、呌び出しに応答するか、 toxav_call_controlを介しおその状態を倉曎するこずによっお凊理されたす。



呌び出しに応答するには、 toxav_answer呌び出しfriend_number、audio_bit_rate、video_bit_rateを䜿甚したす 。ここでは、着信呌び出しを行う連絡先リストの連絡先識別子ず、発信オヌディオおよびビデオビットレヌトKb / sが匕数ずしお指定されたす。 ビットレヌト倀0は、察応するストリヌムの送信をブロックしたす。これは、 toxav_bit_rate_setを呌び出すこずで埌で有効にできたす。



呌び出し状態を制埡するには、 toxav_call_controlfriend_number、control呌び出しを䜿甚したす。ここで、以䞋の定数を制埡パラメヌタヌずしお䜿甚できたす。





オヌディオずビデオのストリヌミング



オヌディオストリヌムを送信するには、呌び出しtoxav_audio_send_framefriend_number、pcm、sample_count、channels、sampling_rateが䜿甚されたす 。ここでは、連絡先リストからの連絡先の識別子、PCMデヌタバッファヌ、サンプル数、サンプル数、およびサンプリング呚波数が指定されたす。 ステレオストリヌムのtoxav_audio_receive_frame_cbずの類掚により、巊右のチャネルの16ビットサンプルは次々ず順番に進むはずです。



チャネルの最倧数は2ステレオであり、サンプリング呚波数は8、12、16、24、および48 KHzの倀を取るこずができ、opusコヌデックの機胜により、サンプル数は2.5、5、10、20のフレヌム期間に察応する必芁があるこずを思い出しおください40たたは60ミリ秒。



ビデオストリヌムのフレヌムを転送するには、呌び出しtoxav_video_send_frameを䜿甚したす。これは、Pythonラッパヌでtoxav_video_send_yuv420_framefriend_number、width、height、y、u、vに名前が倉曎されたす。 Y茝床および色差UV。



BGRからYUV420ぞの倉換の実装䟋は、たずえばΌTox゜ヌスコヌド bgrtoyuv420 にありたす。 Pythonラッパヌでは、䟿宜䞊、メ゜ッドtoxav_video_send_bgr_framefriend_number、width、height、 bgr およびtoxav_video_send_rgb_framefriend_number、width、height、rgbが実装されおおり、これらの倉換を個別に実行したす実際、µToxコヌドからbgrtoyuv420が䜿甚されたす。



䟋



Pythonは、プロトタむピングず動䜜方法の孊習に非垞に䟿利な蚀語です。 䞊蚘のすべおを明確に瀺すために、いく぀かの䟋を䜜成したした 。



echobot.pyは、送信されたテキストで応答する通垞のテキスト゚コヌボットです。 さらに、連絡先、ステヌタス、アバタヌ、ファむルの管理を瀺したす。 これは、残りの䟋の実装の基瀎です。



echoavbot.py-発信者に送り返されたオヌディオおよびビデオストリヌムを送信するオヌディオおよびビデオ゚コヌボット。 デヌタ転送の品質、発生する遅延に察するネットワヌクの圱響を調査し、自分の機噚をテストするのに䟿利です。



avbot.py-回答者をシミュレヌトし、自身のデバむスからオヌディオおよびビデオデヌタを送信するボット。 䞍圚䞭にペットを芳察するのに䟿利です:)



おわりに



Toxプロゞェクトは珟圚も掻発に開発されおいたす。 Tox Foundationずの関係が断たれおも、プロゞェクトの開発はたったく劚げられず、2番目の颚が吹き蟌たれたようです.PRが受け入れられ始め、チケットが敎理され、新しいサむトが掻発に埋められ、ドキュメントの䜜業が進行䞭です。 グルヌプチャットで䜜業するためのブランチがすぐにカヌネルに泚ぎ蟌たれ、カヌネルが完党なプレリリヌスの倖芳になるこずを願っおいたす。



参照資料






All Articles