Video Drawablesと組み合わせたクラウド認識の使用

一般的なビデオdrawable

play()関数が呼び出されると、ARObjectがonImageRecognizedでない場合に、ビデオ描画可能ファイルは再生を開始できます。これは予期した動作です。動画を再生できるようにしたい場合は、AR.ImageTrackableまたはGeoObjectのonImageRecognizedトリガーとonImageLostトリガーを使用してplay()resume()、およびpause()関数を呼び出してください。これについてはVideo-Playback Statessのサンプルの実装を参照してください。

ここで記載するもう1つの重要な点は、enabledプロパティです。 現在の実装ではビデオレンダリングが無効になっていますが、オーディオトラックはまだバックグラウンドで再生されています。 したがって、enabledプロパティをfalseに設定するだけでなく、AR.VideoDrawablepause()関数も呼び出してください。

クラウド認識と組み合わせたビデオdrawable

クラウドの認識は、上記の段落に複雑な小さなレイヤを追加するだけです。クラウド認識では、.wtcファイルで見つかるものと似たコンテンツを使用していることを知っておくことが重要です。サーバーの応答が成功すると、既存の内部.wtcコンテンツが新しいものに置き換えられます。AR.ImageTrackableがコンテンツAで作成され、新しいコンテンツBがクライアントに届いた場合、AR.ImageTrackableonImageRecognizedおよびonImageLostイベントを受け取ることができません。これが、新しいサーバー応答が受信された場合に既存のAR.ImageTrackableをすべて削除する理由です。 クラウド認識 - Basic Recognition OnClick 75行目で実装しています。新しいサーバー応答が受信されるたびに、すべての強化した機能が削除されます(55行目と59行目)。 これにより、使用できなくなった拡張またはトラッキングが可能なアイテムが何も残っていないということが保証されます。

補強とトラッキングが可能アイテムが削除されない場合、それらはまだSDK内で生存しています。 トラッキングできるアイテムは、もはやそのイベントを発生させることができないため、それらが属する参照画像は、現在のカメラのフレーム内に表示されてはおらず拡張したアイテムは表示されません。 そのため、ビジョントリガの状態に基づいて、ビデオdrawableを開始または停止することができなくなります。

ビデオdrawableがplay()関数の呼び出しを受け、トラッキングデータが次のサーバレスポンスに置き換えられる前に、コンテンツのロードを内部的に開始した時、十分なビデオデータがロードされ次第オーディオトラックの再生を開始します。 pause()関数はビジョントリガーから引き続き呼び出すことができますが、視覚トリガーから呼び出すことはできません(トラッキングが可能なデータは新しいトラッキングデータによって既に無効にされています)。 新しいトラッキングデータが届いた後にビデオdrawableが削除されると、オブジェクトが削除されてしまったためにロードまたは再生操作が実行されなくなり、この動作は発生しなくなります。

つまり要約すると、正常なサーバー応答が受信されると、それまでのすべての拡張とトラッキングデータが削除されるということが非常に重要となります。

ビデオフレームはもはやレンダリングされませんが、ビデオdrawablesがオーディオのトラックを再生し続ける状況を示すシーケンス図が添付されています。

シーケンス図は、ユーザーがボタンをタップするたびにカメラフレームをサーバーに送信するArchitect Worldの使用方法を示しています。

最初、2回ターゲットAが認識されます。 ターゲットBは、第3の要求が送信されたときに認識されます。 ターゲットAが認識された場合、ビデオdrawableオブジェクトおよびトラッキングdrawableオブジェクトが作成されます。 ターゲットBには、(単純化のために)定義された拡張はありません。 また、ここで注目すべきことは、サーバからの各応答が(前述のように)現在ロードされているトラッキングデータを無効にするという事実です。

最初のクライアント/サーバ応答は、問題なくビデオdrawableを開始するだけです。 サーバーの応答が処理されると、ビデオドロウアブルが作成され、コンテンツのロードが開始されます。 十分なビデオデータが受信されると、ビデオdrawableはビデオのレンダリングを開始し、オーディオトラックを再生します。

2番目のクライアント/サーバー応答はまだ問題ありません。 以前のビデオdrawableを新しいものに置き換えてplay()関数を呼び出します(最初のビデオデータを削除すると、すでにロードされているビデオデータがすべて削除されるため、同じビデオデータのロードが再開されます)。

重要なクライアント/サーバーの応答は3番目です。2番目の応答がクライアントに到着する前に、ユーザはサーバ間通信を開始したとします。すると、2番目のビデオdrawableがコンテンツのロードを開始している間に、3番目のサーバレスポンスがクライアントに到着しました。これにより、2番目の応答で作成されたトラッキングが可能なものが到達不能になりました。参照画像が現在のカメラフレーム内にあるかもしれませんが、参照画像データは既に3番目の応答によって上書きされているので、添付されたビデオdrawableオブジェクトは表示されません。 2番目のビデオdrawableはすでにロードを開始しているため、クライアントで十分なビデオデータが受信されるとすぐにオーディオ再生が開始されます。その結果、ユーザは2番目のビデオdrawableのオーディオトラックを聞くことができます。このとき、現在のカメラフレーム内のターゲットAの参照画像を持っている可能性がありますが、レンダリングされたフレームを見ることはできません。

この問題を解決するには、新しいサーバー応答が受信されると直ちに、すべての拡張機能とトラッキング機能を削除します