Untitled

 avatar
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