Untitled
unknown
plain_text
5 months ago
1.7 kB
3
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