Untitled
unknown
plain_text
a year ago
1.7 kB
6
Indexable
class Screenshot_WindowsGraphicsCapture:
def __init__(self, hwnd: HWND) -> None:
self.device = get_direct3d_device()
self.item = create_for_window(hwnd)
self.frame_count = 0
self.start_time = None
async def get_frame(self):
event_loop = asyncio.get_running_loop()
# create frame pool
self.frame_pool = Direct3D11CaptureFramePool.create_free_threaded(
self.device,
DirectXPixelFormat.B8_G8_R8_A8_UINT_NORMALIZED,
2,
self.item.size,
)
# create capture session
self.session = self.frame_pool.create_capture_session(self.item)
self.session.is_border_required = False
self.session.is_cursor_capture_enabled = False
def frame_arrived_callback(frame_pool: Direct3D11CaptureFramePool, event_args: Object):
frame = frame_pool.try_get_next_frame()
if frame:
frame.close() # We are not using the frame data, just counting
if self.start_time is None:
self.start_time = time.perf_counter()
self.frame_count += 1
# Print FPS every 100 frames
if self.frame_count % 100 == 0:
elapsed = time.perf_counter() - self.start_time
fps = self.frame_count / elapsed
print(f"Captured {self.frame_count} frames, Avg FPS: {fps:.2f}")
# set callback
self.frame_pool.add_frame_arrived(
lambda fp, o: event_loop.call_soon_threadsafe(frame_arrived_callback, fp, o)
)
# start capture
self.session.start_capture()Editor is loading...
Leave a Comment