Android NDK での記録中にカスタムデータを追加する

録画とPlayback API を使用すると、セッションを録画して、リアルタイムのカメラフィードの代わりに使用できます。ただし、これらの録画には動画データとセンサーデータのみが含まれます。また、セッションの録画にカスタムデータを追加して、再生中にデータをカメラ画像の一部であるかのように返すこともできます。

ARCore の録音にカスタムデータが自動的に含まれることはありません。記録中は ARCore フレームにカスタムデータを追加し、再生中はフレームから同じデータを取得できます。ユーザーがセッションを再生したときに想定どおりのデータが得られるようにアプリをプログラムするかどうかは任意です。

カスタムデータのユースケース

録画にカスタムデータを追加すると、AR アプリの可能性が広がります。具体的なユースケースを次にいくつか示します。

外出先で AR を使用

これまでユーザーは、適切な場所とタイミングでしか AR エクスペリエンスにアクセスできませんでした。リビングルームに AR ランプを置きたい場合、その場所に実際に立ってランプがどう見えるかを確認する必要がありました。カスタム トラックを使用すると、リビングルームを一度録画して、思い切ったときにいつでもバーチャル家具をシーンに追加できます。

AR エクスペリエンスを共同で作成

ライブ セッションがなくても、ユーザーは AR 編集のより多くのオプションを利用できるため、いつでもどこでも独自の AR コンテンツを作成してアクセスできます。たとえば、特定の環境を録画したり、拡張現実効果を追加したり、友だちと共有したりできます。

前提条件

AR の基礎的なコンセプトを理解しておいてください。 と ARCore セッションを構成する方法を確認してください。

カスタムデータを含むレコード

カスタムデータを使用してセッション記録を作成します。

カスタムデータを使用して記録を初期化する

カスタムデータを使用して記録を初期化する手順は次のとおりです。録画セッションを開始、停止、確認するには、AR セッションを録画して再生するをご覧ください。

  1. ArRecordingConfig を取得します。
  2. カスタム UUID で新しい ArTrack を作成します。カスタムデータはすべてここに保存されます。
  3. セッション構成時に作成した ArRecordingConfigArTrack を追加します。
// Initialize a new track with a custom UUID.
// Make sure to save the UUID because it is the ID that you will use to get
// your data back during playback.
ArTrack* track = NULL;
ArTrack_create(ar_session, &track);
// String from UUID generator: de5ec7a4-09ec-4c48-b2c3-a98b66e71893
uint8_t uuid_byte_array[16] = {0xde, 0x5e, 0xc7, 0xa4, 0x09, 0xec,
                               0x4c, 0x48, 0xb2, 0xc3, 0xa9, 0x8b,
                               0x66, 0xe7, 0x18, 0x93};
ArTrack_setId(ar_session, track, uuid_byte_array);

// Add the ArTrack to the recording_config.
// recording_config must already be configured.
ArRecordingConfig_addTrack(ar_session, recording_config, track);
ArTrack_destroy(track);

新しいトラックはすべて別々の録音として扱われ、録音された各トラックは独自の UUID を使用します。

省略可: 追加データを使用してトラックを設定する

後で識別したい場合は、セッションの録音を説明する追加データを使用してトラックを設定できます。たとえば、セッションを録画した場所と時間を説明するメモを追加して、トラックに「タグ」を付けることができます(「このセッションは午後にショッピング モールで録画されました」など)。

// Set additional data on this track.
// For example, describe where you recorded the session.
uint8_t metadata_size = 4;
uint8_t metadata[5] = "HOME";
ArTrack_setMetadata(ar_session, track, metadata, metadata_size);

省略可: MIME タイプでトラックを設定する

アプリが外部ツールに対応する必要がある場合は、トラックに記録されているデータのタイプを記述する MIME タイプのトラックを設定できます。型を指定しない場合、データは application/text に分類されます。ARCore は、データを読み取る際に MIME タイプを無視します。

// Set a MIME type for compatibility with external tools.
ArTrack_setMimeType(ar_session, track, "text/csv");

カスタムデータトラックを記録する

すべてのカスタム トラック データは ArFrame に記録されます。AR セッションは、ArSession_update() を使用してフレームを取得します。フレームにデータを記録する時刻は、再生中にデータが返される時刻と同じです。たとえば、00:07:02 で値「A」を指定して ArFrame_recordTrackData() を呼び出すと、トラックの再生時に 00:07:02 のマークで「A」が返されます。

カスタムデータトラックを記録するには、ArFrame_recordTrackData() を呼び出します。

// Place an AR lamp in a room.
if (place_lamp_button_was_pressed) {
  uint8_t lamp_data[1] = {lamp_id};
  ArFrame_recordTrackData(ar_session, frame, uuid_byte_array, lamp_data,
                          /*payload_size=*/1);
}

カスタムデータ トラックを再生する

再生中にセッションの録音からカスタムデータを抽出します。

再生を初期化する

カスタムデータによる再生の初期化は、通常のセッション録画の再生の初期化と同じです。

カスタムデータを返す

ArFrame_getUpdatedTrackData() を呼び出して、ArFrame に記録されたカスタムデータを取得します。同じフレームから複数のトラックデータを取得できます。たとえば、録画中の同じフレームで ArFrame_recordTrackData() を 2 回呼び出した場合、再生中に ArTrackData の 2 つのインスタンスが返されます。

// Create the container to hold the track data retrieved from the frame.
ArTrackDataList* fetched_track_data_list;
ArTrackDataList_create(ar_session, &fetched_track_data_list);

// Fetch the track data from the frame into the created container.
ArFrame_getUpdatedTrackData(ar_session, frame, uuid_byte_array,
                            fetched_track_data_list);

ArTrackData をコンテナ オブジェクトに取り込んだら、カスタムデータのバイトを抽出します。

// Fetch the size of the track data list.
int32_t fetched_track_data_list_size;
ArTrackDataList_getSize(ar_session, fetched_track_data_list,
                        &fetched_track_data_list_size);

// Iterate through the list.
for (int i = 0; i < fetched_track_data_list_size; i++) {
  ArTrackData* fetched_track_data;
  ArTrackDataList_acquireItem(ar_session, fetched_track_data_list, i,
                              &fetched_track_data);
  // Process "fetched_track_data->sample" as desired
  ArTrackData_release(fetched_track_data);
}
ArTrackDataList_destroy(fetched_track_data_list);

次のステップ