GameDVR 레코딩을 만듭니다. 그러한 레코딩이 이루어지고 있음을 나타내는 UI가 없습니다. 사용자는 레코딩에 액세스할 수 없습니다. 이러한 레코딩은 주어진 시간에 최대 2개까지 만들 수 있습니다. 2번의 레코딩이 이루어지면 XAppCaptureCloseLocalStream을 호출하여 녹음을 닫고 삭제해야 다른 녹음을 할 수 있습니다. 과거 또는 미래의 활동을 캡처하는 데 사용할 수 있습니다.
구문
HRESULT XAppCaptureRecordTimespan(
const SYSTEMTIME * startTimestamp,
uint64_t durationInMilliseconds,
XAppCaptureLocalResult * result
)
매개 변수
startTimestamp _In_opt_
유형: const SYSTEMTIME *
레코딩을 시작할 타임스탬프입니다. 이 매개 변수는 null일 수 있습니다. 이 경우 시스템은 시작 시간을 과거의 durationInMilliseconds 로 자동으로 계산하고 기록에 과거 활동이 포함됩니다.
durationInMilliseconds _In_
형식: uint64_t
녹음 길이(밀리초).
result _Out_
유형: XAppCaptureLocalResult *
기능 완료 시 캡처 결과를 포함합니다. 결과 기록을 읽을 수 있는 방법은 XAppCaptureReadLocalStream 을 참조하세요.
반환 값
형식: HRESULT
함수 결과입니다.
사용자의 GameDVR 설정이 게임 캡처를 금지하는 경우 이 함수는 E_ACCESSDENIED를 반환합니다.
설명
startTimestamp 매개 변수를 전달하여 과거 활동을 기록하는 방법에는 두 가지가 있습니다.
처음에는 Null이 전달됩니다. 시스템은 자동으로 타임스탬프를 계산하고 지금부터 durationInMilliseconds 지난 활동을 기록합니다.
참고 항목
새 클립을 위한 공간을 만들기 위해 할당된 공간이 채워지면 이전 클립이 삭제됩니다. 일정 기간 동안 클립을 유지하려면 PLS (영구 로컬 스토리지), 연결된 스토리지(예: XGameSave 또는 XGameSaveFiles) 또는 유사한 스토리지 시스템을 사용합니다.
XAppCaptureLocalResult appCaptureLocalResult = { 0 };
uint64_t durationInMs = 5000; /* 5 seconds, for example */
if (SUCCEEDED(XAppCaptureRecordTimespan(nullptr, durationInMs, &appCaptureLocalResult))) // record the past 5000ms (startTimestamp is calculated automatically)
{
appLog.AddLog("StartTimestamp: %llu, Duration (ms): %llu, File Size (bytes): %llu, Width: %d, Height: %d, Encoding: %d, Color Format: %d\n", appCaptureLocalResult.clipStartTimestamp, appCaptureLocalResult.durationInMilliseconds, appCaptureLocalResult.fileSizeInBytes,
appCaptureLocalResult.width, appCaptureLocalResult.height, appCaptureLocalResult.encoding, appCaptureLocalResult.colorFormat);
}
두 번째에서는 SYSTEMTIME 또는 FILETIME을 ULARGE_INTEGER로 변환하고 필요한 산술을 수행한 다음 ULARGE_INTEGER를 다시 SYSTEMTIME으로 변환하여 원하는 시작 타임스탬프를 계산해야 합니다.
void SubtractMsDurationFromFileTimeToULarge(_In_ FILETIME* pFileTime, _In_ uint64_t durationInMs, _Out_ ULARGE_INTEGER* pUlResultingTime)
{
ULARGE_INTEGER fileTimeAsUlarge;
fileTimeAsUlarge.LowPart = pFileTime->dwLowDateTime;
fileTimeAsUlarge.HighPart = pFileTime->dwHighDateTime;
// Convert ms to 100 ns intervals, the convention used by FILETIME
pUlResultingTime->QuadPart = fileTimeAsUlarge.QuadPart - (durationInMs * 10000LL);
}
void ULargeToSystemTime(_In_ ULARGE_INTEGER ulInputTime, _Out_ SYSTEMTIME* pOutputTime)
{
FILETIME inputAsFiletime;
inputAsFiletime.dwLowDateTime = ulInputTime.LowPart;
inputAsFiletime.dwHighDateTime = ulInputTime.HighPart;
FileTimeToSystemTime(&inputAsFiletime, pOutputTime);
}
void YourFunction()
{
XAppCaptureLocalResult appCaptureLocalResult = { 0 };
uint64_t durationInMs = 8000; /* 8 seconds, for example */
FILETIME now;
ULARGE_INTEGER calculatedStartTimestamp;
SYSTEMTIME startTimestampAsSystemTime;
XAppCaptureVideoCaptureSettings captureSettings = { 0 };
GetSystemTimeAsFileTime(&now);
SubtractMsDurationFromFileTimeToULarge(&now, durationInMs, &calculatedStartTimestamp);
ULargeToSystemTime(calculatedStartTimestamp, &startTimestampAsSystemTime);
if (SUCCEEDED(XAppCaptureGetVideoCaptureSettings(&captureSettings)) && captureSettings.isCaptureByGamesAllowed && (captureSettings.maxRecordTimespanDurationInMs >= durationInMs)){
if (SUCCEEDED(XAppCaptureRecordTimespan(&startTimestampAsSystemTime, durationInMs, &appCaptureLocalResult))) // record 8000ms starting from 8000ms before now (calculated manually)
{
appLog.AddLog("StartTimestamp: %llu, Duration (ms): %llu, File Size (bytes): %llu, Width: %d, Height: %d, Encoding: %d, Color Format: %d\n", appCaptureLocalResult.clipStartTimestamp, appCaptureLocalResult.durationInMilliseconds, appCaptureLocalResult.fileSizeInBytes,
appCaptureLocalResult.width, appCaptureLocalResult.height, appCaptureLocalResult.encoding, appCaptureLocalResult.colorFormat);
}
}
}
XAppCaptureRecordTimespan을 사용하여 startTimestamp를 현재 시스템 시간으로 지정하여 다음 기간InMilliseconds 밀리초의 작업을 기록할 수도 있습니다.
XAppCaptureLocalResult appCaptureLocalResult = { 0 };
uint64_t durationInMs = 10000; /* 10 seconds, for example */
SYSTEMTIME nowStartTimestamp;
XAppCaptureVideoCaptureSettings captureSettings = { 0 };
GetSystemTime(&nowStartTimestamp);
if (SUCCEEDED(XAppCaptureGetVideoCaptureSettings(&captureSettings)) && captureSettings.isCaptureByGamesAllowed){
if (SUCCEEDED(XAppCaptureRecordTimespan(&nowStartTimestamp, durationInMs, &appCaptureLocalResult))) // record the next 10 seconds starting now
{
appLog.AddLog("StartTimestamp: %llu, Duration (ms): %llu, File Size (bytes): %llu, Width: %d, Height: %d, Encoding: %d, Color Format: %d\n", appCaptureLocalResult.clipStartTimestamp, appCaptureLocalResult.durationInMilliseconds, appCaptureLocalResult.fileSizeInBytes,
appCaptureLocalResult.width, appCaptureLocalResult.height, appCaptureLocalResult.encoding, appCaptureLocalResult.colorFormat);
}
}
XAppCaptureLocalResult 및 XAppCaptureReadLocalStream을 참조하세요.
요구 사항
헤더: XAppCapture.h
라이브러리: xgameruntime.lib
지원되는 플랫폼: Xbox One 패밀리 콘솔 및 Xbox Series 콘솔