Skip to content

Latest commit

ย 

History

History
142 lines (110 loc) ยท 4.42 KB

File metadata and controls

142 lines (110 loc) ยท 4.42 KB

WGC Capture DLL ๆž„ๅปบ่ฏดๆ˜Ž

English | ็ฎ€ไฝ“ไธญๆ–‡

้กน็›ฎ็ป“ๆž„

wgc_python/
โ”œโ”€โ”€ wgc_python.py            # Python API
โ”œโ”€โ”€ test.py                  # ๆต‹่ฏ•่„šๆœฌ
โ”œโ”€โ”€ test_api.py              # APIๅŠŸ่ƒฝๆต‹่ฏ•
โ”œโ”€โ”€ requirements.txt         # Python ไพ่ต–
โ”œโ”€โ”€ wgc_python.dll           # ็ผ–่ฏ‘ๅŽ็š„ DLL (้œ€ๅคๅˆถๅˆฐๆญค็›ฎๅฝ•)
โ””โ”€โ”€ wgc_python_dll/          # C++ DLL ๆบ็ 
    โ”œโ”€โ”€ WGCWindowCapture.h/cpp   # ๆ ธๅฟƒๆ•่Žท็ฑป (ๅŒ็ผ“ๅ†ฒStaging็บน็† + Pause/Resume)
    โ”œโ”€โ”€ WGCExport.h/cpp          # DLL ๅฏผๅ‡บๆŽฅๅฃ
    โ”œโ”€โ”€ D3DInterop.cpp           # D3D11 ไบ’ๆ“ไฝœ
    โ”œโ”€โ”€ WindowEnumerator.h/cpp   # ็ช—ๅฃๆžšไธพ
    โ”œโ”€โ”€ pch.h                    # ้ข„็ผ–่ฏ‘ๅคด
    โ””โ”€โ”€ packages/                # NuGet ๅŒ…

ๅ‰็ฝฎๆกไปถ

  1. Visual Studio 2022 (ๆ”ฏๆŒ C++20)
  2. Windows 11 SDK (10.0.26100)
  3. NuGet ๅŒ… (ๅทฒๅŒ…ๅซๅœจ packages/ ็›ฎๅฝ•):
    • Microsoft.Windows.CppWinRT.2.0.240405.15
    • Microsoft.Windows.ImplementationLibrary.1.0.240803.1
    • Microsoft.Windows.SDK.CPP.10.0.26100.1

ๆž„ๅปบๆญฅ้ชค

ๆ–นๆณ•ไธ€๏ผšVisual Studio GUI

  1. ๆ‰“ๅผ€ wgc_python_dll/wgc_python_dll.sln
  2. ้…็ฝฎ: Release | x64
  3. ๅณ้”ฎ้กน็›ฎ โ†’ ็”Ÿๆˆ
  4. ๅคๅˆถ DLL ๅˆฐ wgc_python/ ็›ฎๅฝ•

ๆ–นๆณ•ไบŒ๏ผšๅ‘ฝไปค่กŒ (MSBuild)

# ๅœจ wgc_python_dll ็›ฎๅฝ•ๆ‰ง่กŒ
msbuild wgc_python_dll.sln /p:Configuration=Release /p:Platform=x64

# ๅคๅˆถ DLL
copy "x64\Release\wgc_python.dll" "..\wgc_python.dll"

่พ“ๅ‡บไฝ็ฝฎ

้…็ฝฎ DLL ่ทฏๅพ„
Release wgc_python_dll\x64\Release\wgc_python.dll
Debug wgc_python_dll\x64\Debug\wgc_python.dll

Python ไฝฟ็”จ

# ๅฎ‰่ฃ…ไพ่ต–
pip install numpy opencv-python

# ่ฟ่กŒๆต‹่ฏ•
python test.py
python test_api.py

DLL ๅฏผๅ‡บๅ‡ฝๆ•ฐ

ๅ‡ฝๆ•ฐ ่ฏดๆ˜Ž
EnumerateWindows ๆžšไธพๆ‰€ๆœ‰ๅฏ่ง็ช—ๅฃ
StartContinuousCapture ๅฏๅŠจ่ฟž็ปญๆ•่Žท
GetLatestFrame ่Žทๅ–ๆœ€ๆ–ฐๅธง (BGRA)
FreeImageData ้‡Šๆ”พๅ›พๅƒๆ•ฐๆฎ
StopContinuousCapture ๅœๆญขๆ•่Žท
IsCapturing ๆ˜ฏๅฆๆญฃๅœจๆ•่Žท
GetFrameCount ๅทฒๆ•่Žทๅธงๆ•ฐ
GetLastErrorMsg ่Žทๅ–้”™่ฏฏไฟกๆฏ
PauseCapture ๆš‚ๅœๆ•่Žท (้›ถ่ต„ๆบๅพ…ๆœบ)
ResumeCapture ๆขๅคๆ•่Žท
IsPaused ๆ˜ฏๅฆๅทฒๆš‚ๅœ

ๆŠ€ๆœฏๆžถๆž„

WGCๆ•่Žท โ†’ GPU Surface็บน็†
              โ†“
         CopyResource (GPUๅผ‚ๆญฅๅคๅˆถ)
              โ†“
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚  ๅŒ็ผ“ๅ†ฒStaging็บน็†       โ”‚
    โ”‚  [0] ๅ†™ๅ…ฅ โ†โ†’ [1] ่ฏปๅ–   โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
              โ†“
         Map/Unmap (CPUๆŒ‰้œ€่ฏปๅ–)
              โ†“
         Python numpyๆ•ฐ็ป„

Pause/Resume ๆœบๅˆถ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    FrameArrived ๅ›ž่ฐƒ                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  if (m_isPaused) return;  // ๆš‚ๅœๆ—ถ็›ดๆŽฅ่ทณ่ฟ‡          โ”‚
โ”‚                                                      โ”‚
โ”‚  // ๆญฃๅธธๅค„็†๏ผšGPU โ†’ CPU ๆ‹ท่ด                         โ”‚
โ”‚  CopyResource(stagingTexture, surfaceTexture);      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ†‘                              โ†‘
    Resume ๆ—ถ                    Pause ๆ—ถ
  m_isPaused = false           m_isPaused = true
  ๅผ€ๅง‹ๅค„็†ๅธง                    ่ทณ่ฟ‡ๆ‰€ๆœ‰ๅธงๅค„็†

ๆ ธๅฟƒไผ˜ๅŠฟ๏ผš

  • ๆš‚ๅœๆ—ถ๏ผšGPU ๅœๆญขๆ‹ท่ด๏ผŒCPU ๅ ็”จๅฝ’้›ถ
  • ๆขๅคๆ—ถ๏ผš<1ms ๅปถ่ฟŸ๏ผŒๆ— ้œ€้‡ๆ–ฐๅˆๅง‹ๅŒ–
  • ไผš่ฏๅค็”จ๏ผš้ฟๅ…้ข‘็นๅฏๅœ็š„ 50ms+ ๅผ€้”€

ๅธธ่ง้—ฎ้ข˜

็ผ–่ฏ‘้”™่ฏฏ C2065/C3536

ๆฃ€ๆŸฅ lambda ่กจ่พพๅผไธญ็š„็ฑปๅž‹ๅฃฐๆ˜Ž๏ผŒไฝฟ็”จๆ˜พๅผ WinRT ็ฑปๅž‹่€Œ้ž autoใ€‚

ๆ‰พไธๅˆฐ DLL

็กฎไฟ wgc_python.dll ไธŽ wgc_python.py ๅœจๅŒไธ€็›ฎๅฝ•ใ€‚

ๆ•่Žทๅคฑ่ดฅ

  1. ็กฎไฟ็›ฎๆ ‡็ช—ๅฃๅฏ่ง
  2. ็กฎไฟ็ช—ๅฃๆ ‡้ข˜/็ฑปๅๆญฃ็กฎ
  3. ๆฃ€ๆŸฅ get_last_error() ่ฟ”ๅ›ž็š„้”™่ฏฏไฟกๆฏ

Pause/Resume ไธ็”Ÿๆ•ˆ

็กฎไฟๅœจๆ•่Žท็Šถๆ€ไธ‹่ฐƒ็”จ๏ผˆis_capturing() ่ฟ”ๅ›ž True๏ผ‰ใ€‚