7

この質問が本質的に無意味でないことを願っています。

私はゲームを開発しています。基礎となるゲーム エンジン (Python) をグラフィックス コンポーネントから分離しました。いくつかのパラメーターをファジングし、ゲーム エンジンを使用してゲームの一部をシミュレートし、Pygame を使用して視覚化するスクリプトがあります。

次のプロセスを自動化したいと思います。

  1. シミュレーションを cronjob として実行
  2. Pygame を使用して視覚化します (ヘッドレス)
  3. ビジュアライゼーションを短い (~10 秒) ビデオ ファイルとして保存します。
  4. プログラムで動画を Youtube にアップロードする

理想的には、これを 1 日に数回行い、チームの技術者ではないメンバーがビデオを見て、ゲームの視覚的側面に関するフィードバックを提供できるようにしたいと考えています。

コードの準備ができているので、Pygame を使用したいと思います。しかし、おそらく PIL のようなものを使用して一連の画像ファイルを作成し、そこから移動する必要があると思います。

これは Pygame で可能ですか? PILを使用するだけですか?このようなことを達成するための他のアイデアはありますか?

4

2 に答える 2

3

アントンの答えは、この質問をより深く掘り下げるきっかけになりました。幸いなことに、 Pygame を headless で実行できることを発見したので、Anton の方法よりも簡単にやりたいことを達成できました。

基本的なワークフローは次のとおりです。

  1. ヘッドレスで実行するように pygame をセットアップする
  2. Pygameを使用して各フレームの画面イメージを保存し、ゲームを実行します
  3. ffmpegを使用して画像ファイルからビデオを作成する
  4. youtube-uploadを使用して YouTube に動画をアップロードする

サンプル コード (厳密にはテストされていないため、私自身のコードの簡略化されたバージョン):

# 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='your.name@gmail.com'
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)

ビデオが作成されたら、おそらくすべての画像ファイルを削除したいと思うでしょう。

スクリーンショットをヘッドレスでキャプチャするのに少し問題がありましたが、ここで説明するように回避しました: In Pygame, how can I save a screen image in headless mode?

問題なく、スクリプトを cronjob として実行するようにスケジュールできました。

于 2013-01-25T05:03:09.247 に答える
3

Linux で実行していて、グラフィック エンジンが X で動作していると仮定すると、Xvfb (X 仮想フレームバッファ) を使用して、任意のアプリケーションをヘッドレスで実行できます。仮想(ヘッドレス)フレームバッファ セッションのビデオ エンコーダを実行できます。このタスクを簡単にするためのユーティリティがいくつかあります。

次のようなトップレベルのスクリプトを作成する必要があります。

  • Xvfb を起動する
  • ビデオ エンコーダー (つまり、ffmpeg) を起動します。
  • Xvfb でゲームを実行します。ユーザー入力なしで実行できると仮定すると、ゲームを変更する必要はまったくありません。DISPLAY 環境変数を正しい値に設定するだけです。
  • ビデオのエンコードを終了する
  • 動画を youtube にアップロードする

Xvfb と ffmpeg は間違いなく、ヘッドレスでゲームを記録するための方法です。これにより、変更なしでゲームをそのまま記録できます。実行可能であるべきですが、必ずしも簡単ではありません。上記のスクリプトで作業を開始できるはずです。

于 2013-01-22T03:43:01.367 に答える