2013-01-22 31 views
7

Tôi hy vọng câu hỏi này không phải là vô nghĩa.Có thể chạy Pygame như một cronjob không?

Tôi đang phát triển trò chơi. Tôi đã tách ra công cụ trò chơi cơ bản (bằng Python) từ thành phần đồ họa. Tôi có một kịch bản làm mờ một số tham số, mô phỏng một phần của trò chơi bằng cách sử dụng công cụ trò chơi, và sau đó hình dung nó bằng cách sử dụng Pygame.

tôi muốn tự động hóa quy trình sau:

  1. Chạy mô phỏng như cronjob
  2. Hình dung nó bằng cách sử Pygame (headlessly)
  3. Lưu hình dung như một tập tin ngắn (~ 10 giây) Video
  4. Lập trình tải video lên Youtube

Lý tưởng nhất, tôi muốn làm điều này một vài lần một ngày để không kỹ thuật m nhóm của tôi có thể xem video và đưa ra phản hồi về khía cạnh trực quan của trò chơi.

Tôi muốn sử dụng Pygame vì tôi đã có sẵn mã để đi. Nhưng tôi nghi ngờ tôi có lẽ nên sử dụng một cái gì đó như PIL để tạo ra một loạt các tập tin hình ảnh và đi từ đó.

Điều này có thể xảy ra với Pygame không? Tôi có nên sử dụng PIL không? Bất kỳ ý tưởng khác để hoàn thành một cái gì đó như thế này?

Trả lời

3

Giả sử bạn đang chạy trên Linux và công cụ đồ họa của bạn hoạt động trong X, bạn không thể chạy bất kỳ ứng dụng nào bạn muốn bằng Xvfb (bộ đệm khung ảo X). Bạn có thể chạy bộ mã hóa video của phiên framebuffer ảo (không đầu). Có một vài tiện ích để làm nhiệm vụ này dễ dàng hơn:

Bạn muốn tạo ra một kịch bản cấp cao nhất mà sẽ:

  • Khởi động Xvfb
  • Khởi động bộ mã hóa video (ví dụ: ffmpeg)
  • Chạy trò chơi của bạn trong Xvfb. Bạn không cần phải sửa đổi trò chơi của mình theo bất kỳ cách nào, giả sử nó có thể chạy mà không có đầu vào của người dùng, chỉ cần đặt biến môi trường DISPLAY thành giá trị chính xác.
  • Kết thúc mã hóa video
  • Tải video youtube

Xvfb và ffmpeg chắc chắn con đường để đi để ghi lại các trò chơi headlessly, điều này đảm bảo bạn có thể ghi lại trò chơi của bạn như là không có sửa đổi. Nó phải có thể thực hiện được nhưng không nhất thiết phải dễ dàng. Các kịch bản trên nên hy vọng bạn bắt đầu.

1

Anton's answer đã truyền cảm hứng cho tôi để tìm hiểu kỹ hơn về câu hỏi này. Hạnh phúc, tôi phát hiện ra nó có thể run Pygame headlessly, cho phép tôi hoàn thành những gì tôi muốn làm một chút đơn giản hơn phương pháp của Anton.

Các công việc cơ bản diễn ra như sau:

  1. Cài đặt pygame để chạy headlessly
  2. Chạy trò chơi của tôi, tiết kiệm một hình ảnh màn hình cho mỗi khung sử dụng Pygame
  3. Tạo video từ các tập tin hình ảnh sử dụng ffmpeg
  4. Tải video lên Youtube bằng cách sử dụng youtube-upload

Mẫu mã (phiên bản đơn giản của mã riêng của tôi vì vậy điều này đã không được kiểm tra nghiêm ngặt):

# imports 
import os 
import subprocess 
import pygame 
import mygame 

# setup pygame to run headlessly 
os.environ['SDL_VIDEODRIVER'] = 'dummy' 
pygame.display.set_mode((1,1)) 

# can't use display surface to capture images for some reason, so I set up 
# my own screen using a pygame rect 
width, height = 400, 400 
black = (0,0,0) 
flags = pygame.SRCALPHA 
depth = 32 
screen = pygame.Surface((width, height), flags, depth) 
pygame.draw.rect(screen, black, (0, 0, width, height), 0) 

# my game object: screen becomes attribute of game object: game.screen 
game = mygame.MyGame(screen) 

# need this file format for saving images and encoding video with ffmpeg 
image_file_f = 'frame_%03d.png' 

# run game, saving images of each screen 
game.init() 
while game.is_running: 
    game.update() # updates screen 
    image_path = image_file_f % (game.frame_num) 
    pygame.image.save(game.screen, image_path) 

# create video of images using ffmpeg 
output_path = '/tmp/mygame_clip_for_youtube.mp4' 

ffmpeg_command = (
    'ffmpeg', 
    '-r', str(game.fps), 
    '-sameq', 
    '-y', 
    '-i', image_file_f, 
    output_path 
) 

subprocess.check_call(ffmpeg_command) 
print "video file created:", output_path 

# upload video to Youtube using youtube-upload 
gmail_address='[email protected]' 
gmail_password='test123' 

upload_command = (
    'youtube-upload', 
    '--unlisted', 
    '--email=%s' % (gmail_address), 
    '--password=%s' % (gmail_password), 
    '--title="Sample Game Clip"', 
    '--description="See https://stackoverflow.com/q/14450581/1093087"', 
    '--category=Games', 
    output_path 
) 

proc = subprocess.Popen(
    upload_command, 
    stdout=subprocess.PIPE, 
    stderr=subprocess.PIPE 
) 
out, err = proc.communicate() 

print "youtube link: %s" % (out) 

Bạn có thể muốn xóa tất cả các file ảnh sau khi video của bạn được tạo.

Tôi đã có một chút rắc rối chụp ảnh chụp màn hình headlessly, mà tôi làm việc xung quanh như đã mô tả ở đây: In Pygame, how can I save a screen image in headless mode?

tôi đã có thể sắp xếp kịch bản của tôi để chạy như một cronjob mà không vấn đề.

+0

Vui mừng được trợ giúp và hy vọng phương pháp bạn mô tả hoạt động tốt. Tùy thuộc vào thời gian chụp, tôi sẽ quan tâm đến tất cả dung lượng đĩa cần thiết để chụp ảnh và CPU cần chuyển đổi chúng thành video (mã hóa phiên Xvfb sẽ rẻ hơn vì nó không cần png giải mã từng khung hình). Xvfb/ffmpeg với lý thuyết sẽ ít thuế hơn. –

Các vấn đề liên quan