Chụp màn hình video game


8

Tôi muốn "nối" vào một trò chơi đang chạy, giả sử Mario Bros và chụp từng khung hình được hiển thị ... lưu khung hình đó vào một tệp hình ảnh. Một ví dụ điển hình của một cái gì đó tương tự là FRAPS. --Lưu ý: Tôi không muốn chụp toàn bộ màn hình / máy tính để bàn. Tôi muốn chụp một cửa sổ được nhắm mục tiêu.

Tôi đã xem qua OBS (Phần mềm phát sóng mở) nhưng nó không đặc biệt nhanh. Đừng hiểu sai ý tôi, đó là phần mềm tuyệt vời, nhưng tiếc là không có / tài liệu kém, tạo ra một dự án lớn được viết bằng c và c ++ gần như không thể truy cập được đối với một lập trình viên mới đến c ++.

Tôi cũng đã xem qua GamingAnywhere , nhưng thật không may, tôi không thể làm cho nó hoạt động được, có rất ít / không có tài liệu, chỉ chạy trong VS2010 và rất lộn xộn (với cách đặt tên biến kém). Tuy nhiên, nó là một dự án nghiên cứu và do đó nó là không có giấy tờ và lộn xộn.

Tôi biết rằng điều này có thể được thực hiện với OpenGL, GDI và với Direct3D, nhưng tôi không thể tìm thấy một số ví dụ hay trên mạng.

Tôi đọc rằng glReadlPixels (sử dụng OpenGL) có thể được sử dụng và tôi đã đọc tài liệu này , nhưng bài viết không đề cập gì đến việc móc vào đồ họa ứng dụng / trò chơi đang chạy.

Câu hỏi:

  1. Tôi có thể kết nối với đồ họa của một trò chơi được phát triển bằng OpenGL không, bằng cách sử dụng Direct3D? Có phải thư viện được sử dụng để kết nối phải giống với thư viện được sử dụng trong trò chơi không?

  2. Làm cách nào để tôi nối vào các khung được hiển thị của trò chơi để tôi có thể xuất các khung đó thành tệp hình ảnh hoặc tệp video? (Chỉ cần một số liên kết hoặc giải thích ngắn gọn về những gì tôi cần làm sẽ rất tuyệt)

  3. BackBuffer - Tôi đọc được rằng việc truy cập BackBuffer rất nhanh để lấy các khung. Có ai có một ví dụ cho tôi về cách làm điều này với các thư viện mới nhất không? Tôi đã thấy rằng hầu hết các ví dụ đã lỗi thời.

  4. Đối với mục đích của tôi, có rõ ràng "điều này nhanh hơn thế không"? Ý tôi là, liệu OpenGL có thể nhanh hơn cho mục đích của tôi không?

Nếu ai đó biết về một dự án nguồn mở (về cơ bản là những gì tôi cần) được phát triển tích cực và được ghi chép tốt, tôi rất muốn biết về nó.


Bây giờ xuất hiện này chỉ có Mac, mà có thể không làm việc cho bạn với Direct3D, nhưng Siphon Tiêm mà sử dụng OBS trên Mac có thể chụp cửa sổ trò chơi mà sử dụng OpenGL nhiều nhanh hơn so với quay video chuẩn. Siphon "cho phép các ứng dụng chia sẻ khung hình - video hoặc tốc độ khung hình đầy đủ - với nhau trong thời gian thực" để trích dẫn trang web.
Glerman

@Glerman Cảm ơn, tôi sẽ kiểm tra xem!
pookie

Câu trả lời:


7

Có thể làm những gì bạn mô tả, nhưng tôi sợ đó không phải là một quá trình tầm thường. Trên thực tế, điều này sẽ rất gắn liền với Hệ điều hành bạn đang nhắm mục tiêu và có thể cũng yêu cầu các chỉnh sửa cụ thể cho trò chơi / ứng dụng cụ thể.

Tôi sẽ bắt đầu xem xét các kỹ thuật tiêm DLL , ví dụ, cho phép chặn các cuộc gọi đến API Direct3D (Windows) hoặc OpenGL, sau đó bạn có thể sử dụng để sao chép bộ đệm khung của ứng dụng. Một tìm kiếm Internet nhanh chóng cho thấy điều nàyđiều này với lời giải thích chi tiết.

Tôi đã từng viết một công cụ chặn OpenGL quy mô nhỏ trên MacOS bằng cách tiêm một mô-đun chia sẻ tùy chỉnh, nhưng nó trong các trường hợp rất được kiểm soát và đưa ra rất nhiều giả định, chẳng hạn như có các đặc quyền gốc trong hệ thống, vì vậy đối với một công cụ sản xuất, nó sẽ là phức tạp hơn nhiều Bạn có thể tìm thấy một dự án rất thú vị khác ở đây về việc chặn API D3D để cài đặt bot AI tự động trên Starcraft, nó sẽ chạm vào các khái niệm rất giống với những gì bạn đang tìm kiếm.

Khi bạn quản lý để chặn API kết xuất cơ bản, sau đó bạn có thể nối mã của mình vào từng SwapBufferscuộc gọi hoặc tương đương để sao chép bộ đệm khung trước đó trước khi trao đổi, sau đó lưu lại (đây là nơi glReadPixelssẽ diễn ra như vậy).

Sao chép và lưu bộ đệm khung một cách hiệu quả cũng là một thách thức. Cách dễ dàng là chỉ cần đổ từng khung hình thành một hình ảnh RGB không nén, nhưng sau đó bạn sẽ kết thúc với hàng trăm gigabyte dữ liệu chỉ trong vài phút chơi trò chơi, vì vậy trừ khi bạn có một mảng ổ cứng đẹp nằm ở góc bảng của bạn ;), bằng cách nào đó bạn sẽ cần phải xem xét việc nén các khung.

Nhược điểm của việc nén các khung hình bây giờ là phải xử lý rất nhiều, vì vậy một cách tiếp cận ngây thơ có thể biến ứng dụng tương tác một lần mà bạn đang cố gắng ghi lại thành một trình chiếu tương tác :(. Vì vậy, ở giai đoạn này, bạn phải bắt đầu suy nghĩ về việc tối ưu hóa.

Không biết bất kỳ dự án nào ngoài đó cung cấp một thư viện để chụp khung hình hiệu quả cho các trò chơi, nhưng đây chắc chắn sẽ là một cái gì đó tốt đẹp để có! Tôi nghĩ rằng một điều có thể cản trở dự án như vậy, như tôi đã đề cập lúc đầu, rằng đây là một điều rất phụ thuộc vào hệ thống, vì vậy các trường hợp sử dụng rất có thể sẽ bị giới hạn trong một nền tảng hoặc HĐH.


Cảm ơn câu trả lời. Tôi nghĩ rằng cuối cùng, tôi sẽ thay vì lưu hình ảnh, truyền chúng đến một máy từ xa, vì vậy sao chép bộ đệm khung có thể là cách tốt nhất. Bạn dường như có một chút kinh nghiệm với công cụ này. Bạn có thể mở rộng bất kỳ câu hỏi nào tôi đặt ra không? Cảm ơn đã giúp đỡ!
pookie

1
@pookie Này! Chắc chắn, tôi có thể mở rộng này. Có điều gì đặc biệt mà bạn muốn tôi nhận xét không? Đối với câu hỏi của bạn, tôi nghĩ rằng 1 & 2 có thể được thực hiện với các móc DLL, vì vậy hãy chắc chắn đọc các liên kết tôi đã đưa vào (đặc biệt là liên kết về starcraft). 3 & 4 sẽ là API cụ thể, nhưng trên OpenGL, bạn có thể bắt đầu với glReadPixels và làm việc từ đó nếu bạn thấy nó quá chậm. Kinh nghiệm của tôi là từ việc ghi lại các khung hình từ các trò chơi của riêng tôi cộng với một số vụ hack DLL được thực hiện trong quá khứ, nhưng tôi chưa bao giờ kết hợp cả hai trong nỗ lực ghi lại các khung hình từ ứng dụng của bên thứ ba;)
glampert

Cảm ơn bạn! Tôi đã kiểm tra các liên kết - Windows DLL tiêm và liên kết starcraft (khá tuyệt vời) dường như là điểm khởi đầu tốt. Tôi cũng sẽ có một cái nhìn sâu sắc về glReadPixels. Theo ý kiến ​​của bạn, bạn thấy công việc nào dễ dàng hơn và bạn đã tìm thấy nhanh hơn: DirectX hay OpenGL?
pookie

@pookie, nếu bạn có một số kinh nghiệm lập trình, tôi nghĩ Direct3D sẽ dễ sử dụng hơn nhiều, các thư viện được thiết kế tốt hơn. Theo quan điểm của tôi, OpenGL có thể "quá thô" (điều này đến từ một người sử dụng OpenGL nhiều hơn D3D). D3D chỉ là Windows, vì vậy đó có thể là một tiêu cực đối với bạn, không biết. Hiệu suất khôn ngoan, tôi không nghĩ sẽ có nhiều sự khác biệt mà bạn sử dụng. Lời khuyên tốt nhất tôi có thể cung cấp cho bạn là: đầu tiên hãy tìm cách làm cho nó hoạt động, sau đó lo lắng về việc tối ưu hóa.
glampert

1
À, ok, nếu bạn quen thuộc với lập trình OOP, thì D3D chắc chắn sẽ dễ dàng hơn. OpenGL là tất cả các thủ tục và sử dụng một loạt các trạng thái toàn cầu, đó chủ yếu là những gì tôi muốn nói về các cạnh thô. Nhưng điêu tôt đẹp nhât se đên vơi bạn!
glampert
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.