API Ghi và phát cho phép bạn quay video và dữ liệu thực tế tăng cường một lần trong một môi trường cụ thể và dùng nội dung đó để thay thế một phiên quay video trực tiếp.
Đ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.
Khả năng tương thích với các API ARCore khác
Do cách xử lý dữ liệu phiên, các API ARCore có thể tạo ra kết quả khác trong khi phát so với kết quả quan sát được trong khi ghi. Chúng cũng có thể tạo ra kết quả khác trong các phiên phát tiếp theo. Ví dụ: số lượng đối tượng có thể theo dõi được phát hiện, thời điểm phát hiện chính xác và tư thế của các đối tượng đó theo thời gian có thể khác nhau trong khi phát.
Khả năng tương thích với Điểm neo trên đám mây
Bạn có thể lưu trữ và phân giải Mốc trên đám mây trong khi ghi hoặc phát lại một phiên.
Đang ghi
Bắt đầu, dừng và kiểm tra trạng thái của bản ghi phiên ARCore.
Ghi lại phiên ARCore
Để ghi một phiên ARCore, hãy định cấu hình phiên và cung cấp URI MP4 cho bản ghi. Gọi ARRecordingManager.StartRecording()
trước khi tiếp tục phiên. Quá trình ghi sẽ tự động bắt đầu khi phiên họp tiếp tục. Để tự động dừng ghi khi phiên bị tạm dừng, hãy gọi ARRecordingConfig.AutoStopOnPause
. Để ghi lại một phần của phiên, hãy gọi ARRecordingManager.StartRecording()
khi phiên đó đang chạy.
ARCoreRecordingConfig recordingConfig = ScriptableObject.CreateInstance<ARCoreRecordingConfig>();
Uri datasetUri = new System.Uri("file:///uri/for/dataset.mp4");
recordingConfig.Mp4DatasetUri = datasetUri.AbsoluteUri;
recordingManager.StartRecording(recordingConfig);
Dừng ghi phiên
Để dừng quay mà không tạm dừng phiên AR đang chạy, hãy gọi ARRecordingManager.StopRecording()
.
recordingManager.StopRecording();
Kiểm tra trạng thái ghi
Bạn có thể sử dụng ARRecordingManager.RecordingStatus
bất cứ lúc nào để xác định trạng thái ghi âm hiện tại.
Debug.Log("Current Recording Status: " + recordingManager.RecordingStatus);
Phát
Phát lại các phiên AR đã ghi trước đó. Các phiên hoạt động sẽ phát lại theo thời gian thực và bạn không thể điều chỉnh tốc độ hoặc chế độ phát của phiên hoạt động.
Phát lại một phiên đã ghi trước đó
Để phát lại một phiên đã ghi trước đó, hãy gọi ARPlaybackManager.SetPlaybackDatasetUri()
và cung cấp URI cho tập dữ liệu mà bạn muốn phát lại. Bạn phải tạm dừng phiên để sử dụng phương thức này. Tiếp tục phiên để thay đổi có hiệu lực.
Sau khi quá trình phát bắt đầu do tiếp tục phiên, việc tạm dừng phiên bằng cách tắt ARSession
sẽ tạm ngưng quá trình xử lý tất cả khung hình ảnh của máy ảnh và mọi dữ liệu cảm biến được ghi lại khác trong tập dữ liệu. Khung hình ảnh của máy ảnh và dữ liệu khung cảm biến bị loại bỏ theo cách này sẽ không được xử lý lại khi phiên tiếp tục được tiếp tục bằng cách tiếp tục phiên. Tính năng theo dõi AR cho phiên thường sẽ bị ảnh hưởng do khoảng trống trong dữ liệu đã xử lý.
// Disable the ARSession to pause the current AR session.
session.enabled = false;
// In the next frame, provide a URI for the dataset you wish to play back.
Uri datasetUri = new System.Uri("file:///uri/for/dataset.mp4");
playbackManager.SetPlaybackDatasetUri(datasetUri);
// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the dataset.
session.enabled = true;
Vấn đề đã biết và cách giải quyết
Đã xảy ra một vấn đề đã biết, trong đó lệnh gọi đến ARPlaybackManager.SetPlaybackDatasetUri()
trả về ErrorPlaybackFailed
.
Điều này xảy ra vì có thể mất một vài khung hình để một phiên bị tạm dừng. Nếu ARPlaybackManager.SetPlaybackDatasetUri()
được gọi trước khi phiên bị tạm dừng, thì phương thức này sẽ không thể truy cập vào phiên, do đó sẽ trả về lỗi.
Bạn có thể sử dụng mã sau làm giải pháp khắc phục.
// Workaround for known issue where `playbackManager.SetPlaybackDatasetUri()`
// returns `ErrorPlaybackFailed` because it can take several frames for a
// session to be paused.
// Reference to the ARSession component in the scene.
ARSession session;
void PlaybackDataset()
{
setPlaybackDataset = true;
// Pause the current AR session.
session.enabled = false;
// Set a timeout for retrying playback retrieval.
timeout = 10f;
}
// Next frame
void Update()
{
...
if (setPlaybackDataset)
{
PlaybackResult result = playbackManager.SetPlaybackDatasetUri(datasetUri);
if (result == PlaybackResult.ErrorPlaybackFailed || result == PlaybackResult.SessionNotReady)
{
// Try to set the dataset again in the next frame.
timeout -= Time.deltaTime;
}
else
{
// Do not set the timeout if the result is something other than ErrorPlaybackFailed.
timeout = -1f;
}
if (timeout < 0.0f)
{
setPlaybackDataset = false;
// If playback is successful, proceed as usual.
// If playback is not successful, handle the error appropriately.
}
}
...
}
Dừng phát
Để dừng phát, hãy gọi ARPlaybackManager.SetPlaybackDatasetUri()
và đặt URI tập dữ liệu thành null
.
// Disable the ARSession to pause the current AR session.
session.enabled = false;
// In the next frame, unset the playback dataset URI.
playbackManager.SetPlaybackDatasetUri(null);
// In the frame after that, re-enable the ARSession to resume the session using
// the device camera and other sensors.
session.enabled = true;
Bắt đầu lại quá trình phát từ đầu
Để bắt đầu lại quá trình phát từ đầu tập dữ liệu, hãy gọi ARPlaybackManager.SetPlaybackDatasetUri()
và chỉ định cùng một bản ghi MP4 trước khi tiếp tục phiên.
// Disable the ARSession to pause the current AR session.
session.enabled = false;
// In the next frame, specify the same dataset URI.
playbackManager.SetPlaybackDatasetUri(datasetUri); // Same URI that was previously set.
// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the dataset.
session.enabled = true;
Phát lại một phiên khác
Để phát lại một tập dữ liệu khác, hãy tạm dừng phiên và chỉ định tập dữ liệu mới trước khi tiếp tục phiên.
// Disable the ARSession to pause the current AR session.
session.enabled = false;
// In the next frame, specify a new dataset URI.
Uri newDatasetUri = new System.Uri("file:///uri/for/different/dataset.mp4");
playbackManager.SetPlaybackDatasetUri(newDatasetUri); // Different URI than was previously set.
// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the new dataset.
session.enabled = true;
Kiểm tra trạng thái phát
Bạn có thể sử dụng ARPlaybackManager.PlaybackStatus
bất cứ lúc nào để xác định trạng thái phát hiện tại.
Debug.Log("Current Playback Status: " + playbackManager.PlaybackStatus);
Bước tiếp theo
- Tìm hiểu cách thêm dữ liệu tuỳ chỉnh vào các phiên đã ghi.