XAppCaptureReadScreenshotStream
스크린샷 스트림을 읽습니다.
구문
HRESULT XAppCaptureReadScreenshotStream(
XAppCaptureScreenshotStreamHandle handle,
uint64_t startPosition,
uint32_t bytesToRead,
uint8_t* buffer,
uint32_t* bytesWritten
)
매개 변수
handle _In_
형식: XAppCaptureScreenshotStreamHandle
XAppCaptureOpenScreenshotStream을 호출하여 반환된 스크린샷 스트림 핸들입니다.
startPosition _In_
형식: uint64_t
읽기를 시작할 스트림의 위치입니다.
bytesToRead _In_
형식: uint32_t
스트림에서 읽을 바이트 수입니다.
buffer _Out_writes_to_(bytesToRead,bytesWritten)
형식: uint8_t
XAppCaptureReadScreenshotStream으로 읽은 바이트를 포함할 버퍼입니다.
bytesWritten _Out_
형식: uint32_t*
buffer에 실제로 기록된 바이트 수입니다.
반환 값
형식: HRESULT
함수 결과입니다.
설명
참고 항목
이 함수는 시간에 민감한 스레드에서 호출하는 것이 안전하지 않습니다. 자세한 내용은 시간에 민감한 스레드를 참조하세요.
스크린샷을 읽기 전에 XAppCaptureOpenScreenShotStream으로 스크린샷 스트림을 열어야 합니다. 그러면 handle 매개 변수에 필요한 XAppCaptureScreenshotStreamHandle이 생성됩니다. 그런 후 이 함수를 호출하여 스크린샷을 읽을 수 있습니다. startPosition 및 bytesToRead 매개 변수는 스크린샷의 한 섹션을 읽을 수 있게 해줍니다. 이 방식은 큰 스트림을 한 번에 한 섹션씩 읽을 때 유용합니다. XAppCaptureOpenScreenShotStream의 totalBytes 출력 매개 변수에서 스트림의 총 크기를 가져올 수 있습니다. 출력 매개 변수 buffer 및 bytesWritten은 이 함수에서 반환된 데이터를 정확하게 읽을 수 잇게 해줍니다. 스크린샷 데이터를 읽은 후에는 메모리 누수를 방지하기 위해 XAppCaptureCloseScreenshotStream으로 스크린샷 스트림을 닫습니다.
const int MAX_DATA = 1024;
XAppCaptureTakeScreenshotResult takeScreenshotResult = {0};
XAppCaptureScreenshotStreamHandle handle = nullptr;
XAppCaptureScreenshotFormatFlag screenshotFormat = XAppCaptureScreenshotFormatFlag::SDR;
BYTE buffer[MAX_DATA];
HANDLE file = INVALID_HANDLE_VALUE;
UINT64 totalBytesRead = 0;
UINT64 totalBytesToRead = 0;
bool hdrAvailable = false;
/* ... obtain takeScreenshotResult with XAppCaptureTakeScreenshot. Refer to corresponding documentation ... */
hdrAvailable = static_cast<bool>(takeScreenshotResult.availableScreenshotFormats & XAppCaptureScreenshotFormatFlag::HDR);
/* Note: It is optional to obtain the HDR screenshot, if HDR is available. You will need to call XAppCaptureOpenScreenshotStream twice to obtain both SDR and HDR screenshots */
if (hdrAvailable)
{
screenshotFormat = XAppCaptureScreenshotFormatFlag::HDR;
}
if (FAILED_LOG(XAppCaptureOpenScreenshotStream(takeScreenshotResult.localId, screenshotFormat, &handle, &totalBytesToRead)))
{
return;
}
/* T:\ is one example of a writeable local directory. Be aware that the T:\ drive can be invalidated on suspend or resume, and as such it's better to use Persistant Local Storage */
file = CreateFileA(hdrAvailable ? "T:\\MyScreenshot.jxr" : "T:\\MyScreenshot.png", GENERIC_READ | GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (file == INVALID_HANDLE_VALUE)
{
/* You must always call XAppCaptureCloseScreenshotStream on an open XAppCaptureScreenshotStreamHandle to avoid a memory leak */
FAILED_LOG(XAppCaptureCloseScreenshotStream(handle));
return;
}
while (totalBytesRead < totalBytesToRead)
{
uint32_t bytesRead = 0;
uint32_t bytesWritten = 0;
if (SUCCEEDED(XAppCaptureReadScreenshotStream(handle, totalBytesRead, sizeof(buffer), buffer, &bytesRead)))
{
WriteFile(file, buffer, bytesRead, &bytesWritten, NULL);
totalBytesRead += bytesRead;
}
else
{
break;
}
}
FAILED_LOG(XAppCaptureCloseScreenshotStream(handle));
CloseHandle(file);
요구 사항
헤더: XAppCapture.h
라이브러리: xgameruntime.lib
지원되는 플랫폼: Windows, Xbox One 패밀리 콘솔 및 Xbox Series 콘솔
참고 항목
GameDVR 개요
XAppCapture 멤버
XAppCaptureOpenScreenShotStream
XAppCaptureTakeScreenshot
XAppCaptureCloseScreenshotStream