XAppCaptureRecordTimespan

进行 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 (持久本地存储) 、连接的存储 (例如 XGameSaveXGameSaveFiles) 或类似的存储系统,以便将剪辑保留一定时间段。

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

请参阅 XAppCaptureLocalResultXAppCaptureReadLocalStream

要求

头文件:XAppCapture.h

库:xgameruntime.lib

支持的平台:Xbox One 系列主机和 Xbox Series 主机

另请参阅

XAppCapture 成员