GameDVR の記録を行います。 この種の記録が行われていることを示す UI はありません。 ユーザーに記録へのアクセス権がありません。 この種の記録は、特定の時間に最大 2 回行うことができます。 記録が 2 回行われた場合、さらに 1 回記録を行うには、その前に 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 パラメーターを渡して過去のアクティビティを記録するには、2 つの方法があります。
1 つ目の方法では、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);
}
2 つ目の方法では、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 を現在のシステム時刻として指定することで、アクティビティの次の durationInMilliseconds ミリ秒を記録することもできます。
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 本体