Thêm dữ liệu tuỳ chỉnh khi ghi hình trên Android

API Quay và phát cho phép bạn ghi lại một phiên và sử dụng phiên đó thay cho nguồn cấp dữ liệu máy ảnh theo thời gian thực. Tuy nhiên, các bản ghi này chỉ chứa dữ liệu video và cảm biến. Bạn cũng có thể thêm dữ liệu tuỳ chỉnh vào bản ghi phiên và nhận lại dữ liệu đó trong khi phát, như thể dữ liệu đó là một phần của hình ảnh máy ảnh.

ARCore không tự động đưa bất kỳ dữ liệu tuỳ chỉnh nào vào bản ghi. Thay vào đó, nó cho phép bạn thêm dữ liệu tuỳ chỉnh vào khung ARCore trong quá trình ghi và truy xuất chính dữ liệu đó từ khung hình trong khi phát lại. Bạn có quyền lập trình ứng dụng sao cho người dùng có thể lấy lại dữ liệu mà họ mong muốn khi phát lại phiên hoạt động của mình.

Các trường hợp sử dụng dữ liệu tuỳ chỉnh

Việc thêm dữ liệu tuỳ chỉnh vào bản ghi sẽ mở rộng khả năng cho ứng dụng AR của bạn. Sau đây là một số trường hợp sử dụng cụ thể.

Sử dụng AR mọi lúc, mọi nơi

Trước đây, người dùng chỉ có thể truy cập vào các trải nghiệm thực tế tăng cường ở đúng nơi và đúng thời điểm. Nếu muốn đặt đèn thực tế tăng cường trong phòng khách, họ phải đứng ở vị trí đó để xem đèn trông như thế nào ở đó. Nhờ các bản nhạc tuỳ chỉnh, họ có thể quay video phòng khách một lần và thêm đồ nội thất ảo vào cảnh đó bất cứ khi nào họ muốn.

Cùng tạo trải nghiệm thực tế tăng cường

Nếu không yêu cầu phiên phát trực tiếp, thì người dùng sẽ có nhiều lựa chọn chỉnh sửa thực tế tăng cường hơn, cho phép họ tạo và truy cập vào nội dung thực tế tăng cường độc đáo mọi lúc, mọi nơi. Ví dụ: trẻ có thể ghi lại một môi trường nhất định, thêm hiệu ứng thực tế tăng cường và chia sẻ với bạn bè.

Điều kiện tiên quyết

Hãy đảm bảo rằng bạn hiểu các khái niệm cơ bản về AR và cách định cấu hình phiên ARCore trước khi tiếp tục.

Ghi lại bằng dữ liệu tuỳ chỉnh

Tạo bản ghi phiên bằng dữ liệu tuỳ chỉnh.

Khởi chạy một bản ghi có dữ liệu tuỳ chỉnh

Hãy làm theo các bước sau để khởi tạo bản ghi có dữ liệu tuỳ chỉnh. Để bắt đầu, dừng và kiểm tra một phiên ghi, vui lòng xem phần Ghi lại và phát lại một phiên thực tế tăng cường.

  1. Nhận một RecordingConfig.
  2. Tạo một Track mới bằng UUID tuỳ chỉnh. Tất cả dữ liệu tuỳ chỉnh sẽ được lưu tại đây.
  3. Thêm Track vào RecordingConfig mà bạn đã tạo trong quá trình định cấu hình phiên.

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)

Tất cả các bản nhạc mới đều được coi là bản ghi riêng biệt, trong đó mỗi bản nhạc được ghi đều có UUID riêng.

Không bắt buộc: Thiết lập kênh có dữ liệu bổ sung

Trong trường hợp bạn muốn xác định kênh sau này, bạn có thể định cấu hình kênh bằng dữ liệu bổ sung mô tả bản ghi phiên. Ví dụ: bạn có thể "gắn thẻ" một bản nhạc bằng cách thêm ghi chú mô tả vị trí và thời gian bạn ghi lại phiên: "Phiên này được ghi lại tại trung tâm mua sắm vào buổi chiều".

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))

Không bắt buộc: Định cấu hình kênh với một loại MIME

Nếu ứng dụng của bạn cần tương thích với các công cụ bên ngoài, thì bạn có thể thiết lập một kênh với loại MIME mô tả loại dữ liệu được ghi trên kênh đó. Nếu bạn không chỉ định loại, thì dữ liệu sẽ được phân loại là application/text. ARCore bỏ qua loại MIME khi đọc dữ liệu.

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")

Ghi lại các bản nhạc tuỳ chỉnh

Tất cả dữ liệu bản nhạc tuỳ chỉnh được ghi vào Frame. Phiên thực tế tăng cường sử dụng session.update() để lấy khung hình. Thời điểm bạn ghi dữ liệu vào một khung hình cũng là thời điểm dữ liệu được trả về trong quá trình phát. Ví dụ: Nếu gọi recordTrackData() với giá trị “A” tại 00:07:02, bạn sẽ nhận lại “A” tại mốc 00:07:02 khi bản nhạc được phát lại.

Để ghi lại một kênh dữ liệu tuỳ chỉnh, hãy chuyển đổi dữ liệu đó thành một ByteBuffer rồi gọi 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)
}

Phát lại các bản dữ liệu tuỳ chỉnh

Trích xuất dữ liệu tuỳ chỉnh từ bản ghi phiên trong khi phát.

Khởi chạy một lần phát

Việc khởi chạy một lượt phát bằng dữ liệu tuỳ chỉnh cũng giống như việc khởi chạy một bản ghi phiên thông thường.

Trả về dữ liệu tuỳ chỉnh

Gọi getUpdatedTrackData() để truy xuất dữ liệu tuỳ chỉnh được ghi lại trên một khung hình. Bạn có thể truy xuất nhiều dữ liệu theo dõi từ cùng một khung. Ví dụ: nếu đã gọi recordTrackData() hai lần trên cùng một khung hình trong khi quay, bạn sẽ nhận lại được hai thực thể của TrackData trong khi phát.

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)

Sau khi TrackData nằm trong đối tượng vùng chứa, hãy trích xuất các byte của dữ liệu tuỳ chỉnh.

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!
}

Bước tiếp theo