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

API bản ghi 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, những 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à trả về dữ liệu cho bạn trong khi phát lại, dưới dạng một phần của hình ảnh camera.

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

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 giúp tăng khả năng cho các ứng dụng thực tế tăng cường. Sau đây là một số trường hợp sử dụng cụ thể.

Sử dụng công nghệ thực tế tăng cường (AR) khi di chuyển

Trước đây, người dùng chỉ có thể sử dụng công nghệ thực tế tăng cường (AR) ở đúng nơi và vào đú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 tại vị trí đó để xem đèn trông như thế nào ở đó. Nhờ các bản nhạc đặt làm, họ có thể ghi hình phòng khách của mình một lần và thêm đồ nội thất ảo vào cảnh quay bất cứ khi nào họ muốn.

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

Nếu không có yêu cầu về phiên trực tiếp, người dùng có nhiều lựa chọn hơn để chỉnh sửa nội dung thực tế tăng cường, 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ụ: họ có thể ghi hình 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 bạn hiểu rõ các khái niệm cơ bản về AR và cách định cấu hình một 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 động bản ghi bằng dữ liệu tuỳ chỉnh

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

  1. Nhận ArRecordingConfig.
  2. Tạo ArTrack mới bằng mã nhận dạng duy nhất (UUID) tuỳ chỉnh. Tất cả dữ liệu tuỳ chỉnh sẽ được lưu ở đây.
  3. Thêm ArTrack vào ArRecordingConfig mà bạn đã tạo trong quá trình định cấu hình phiên.
// 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);

Tất cả các bản nhạc mới được coi là bản ghi riêng biệt, trong đó mỗi bản nhạc được ghi lại sẽ có mã nhận dạng duy nhất (UUID) riêng.

Không bắt buộc: Định cấu hình bản nhạc bằng dữ liệu bổ sung

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

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

Không bắt buộc: Định cấu hình bản nhạc có loại MIME

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

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

Ghi lại đường dữ liệu tuỳ chỉnh

Tất cả dữ liệu bản nhạc tuỳ chỉnh đều được ghi vào ArFrame. Các phiên thực tế tăng cường sử dụng ArSession_update() để lấy khung hình. Thời điểm bạn ghi dữ liệu vào khung hình cùng với thời điểm dữ liệu sẽ được trả về trong khi phát lại. Ví dụ: Nếu gọi phương thức ArFrame_recordTrackData() với giá trị là "A" là 00:07:02, thì bạn sẽ nhận lại "A" tại dấu 00:07:02 khi bản nhạc được phát lại.

Để ghi lại kênh dữ liệu tuỳ chỉnh, hãy gọi 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);
}

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 của phiên trong khi phát.

Bắt đầu phát

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

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

Hãy gọi ArFrame_getUpdatedTrackData() để truy xuất dữ liệu tuỳ chỉnh được ghi trên ArFrame. Bạn có thể truy xuất nhiều dữ liệu tuyến đường từ cùng một khung. Ví dụ: Nếu bạn đã gọi ArFrame_recordTrackData() hai lần trên cùng một khung hình trong khi quay, thì bạn sẽ nhận lại hai phiên bản của ArTrackData trong khi phát.

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

Khi ArTrackData 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.

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

Bước tiếp theo