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

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

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

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

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

外出先で AR を使用

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

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

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

前提条件

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

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

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

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

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

  1. RecordingConfig を取得します。
  2. カスタム UUID で新しい Track を作成します。すべてのカスタムデータはここに保存されます。
  3. セッション構成時に作成した RecordingConfigTrack を追加します。

Java

// 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.
UUID trackUUID = UUID.fromString("de5ec7a4-09ec-4c48-b2c3-a98b66e71893"); // from UUID generator
Track track = new Track(session).setId(trackUUID);

// Add the Track to the recordingConfig.
// recordingConfig must already be configured.
recordingConfig.addTrack(track);

Kotlin

// 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.
val trackUUID = UUID.fromString("de5ec7a4-09ec-4c48-b2c3-a98b66e71893") // from UUID generator
val track = Track(session).setId(trackUUID)

// Add the Track to the recordingConfig.
// recordingConfig must already be configured.
recordingConfig.addTrack(track)

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

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

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

Java

// Set additional data on this track.
// For example, describe where you recorded the session.
byte[] customTrackData = "airport".getBytes(StandardCharsets.UTF_8);
track.setMetadata(ByteBuffer.wrap(customTrackData));

Kotlin

// Set additional data on this track.
// For example, describe where you recorded the session.
val customTrackData: ByteArray = "airport".toByteArray()
track.setMetadata(ByteBuffer.wrap(customTrackData))

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

アプリを外部ツールと互換性を持たせる必要がある場合は、トラックに記録されるデータの種類を記述する MIME タイプを使用してトラックを構成できます。型を指定しない場合、データは application/text に分類されます。ARCore は、データを読み取る際に MIME タイプを無視します。

Java

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

Kotlin

// Set a MIME type for compatibility with external tools.
track.setMimeType("text/csv")

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

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

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

Java

// Place an AR lamp in a room.
if (placeLampButtonWasPressed) {
  Lamp lampProduct = Lamp.FLOOR; // a floor lamp
  // Convert the lamp data into a byte array.
  ByteBuffer lampData = ByteBuffer.wrap(new byte[] {(byte) lampProduct.ordinal()});
  frame.recordTrackData(trackUUID, lampData);
}

Kotlin

// Place an AR lamp in a room.
if (placeLampButtonWasPressed) {
  val lampProduct = Lamp.FLOOR // a floor lamp
  // Convert the lamp data into a byte array.
  val lampData = ByteBuffer.wrap(byteArrayOf(lampProduct.ordinal.toByte()))
  frame.recordTrackData(trackUUID, lampData)
}

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

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

再生を初期化する

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

カスタムデータを返す

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

Java

// Fetch the data recorded on a select frame and place it in a container object.
Collection<TrackData> trackDataList = frame.getUpdatedTrackData(trackUUID);

Kotlin

// Fetch the data recorded on a select frame and place it in a container object.
val trackDataList: Collection<TrackData> = frame.getUpdatedTrackData(trackUUID)

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

Java

// Extract the bytes of custom data from the list of track data.
for (TrackData trackData : trackDataList) {
  ByteBuffer bytes = trackData.getData();
  Lamp lamp = Lamp.values()[bytes.get()]; // this is the lamp!
}

Kotlin

// Extract the bytes of custom data from the list of track data.
for (trackData in trackDataList) {
  val bytes = trackData.data
  val lamp = Lamp.values()[bytes.get().toInt()] // this is the lamp!
}

次のステップ