72 lines
2.3 KiB
Python
72 lines
2.3 KiB
Python
from os import makedirs
|
|
from os.path import exists, join
|
|
from tempfile import TemporaryFile
|
|
from time import strftime
|
|
|
|
from pygame.image import tostring, frombuffer, save
|
|
from pygame.time import get_ticks
|
|
|
|
from GameChild import GameChild
|
|
|
|
class VideoRecorder(GameChild):
|
|
|
|
def __init__(self, parent):
|
|
GameChild.__init__(self, parent)
|
|
self.display_surface = self.get_display_surface()
|
|
self.delegate = self.get_delegate()
|
|
self.load_configuration()
|
|
self.reset()
|
|
self.subscribe(self.respond)
|
|
|
|
def load_configuration(self):
|
|
config = self.get_configuration("video-recordings")
|
|
self.root = config["path"]
|
|
self.directory_name_format = config["directory-name-format"]
|
|
self.file_extension = config["file-extension"]
|
|
self.frame_format = config["frame-format"]
|
|
self.framerate = config["framerate"]
|
|
|
|
def reset(self):
|
|
self.recording = False
|
|
self.frame_length = None
|
|
self.frames = None
|
|
self.last_frame = 0
|
|
|
|
def respond(self, event):
|
|
compare = self.delegate.compare
|
|
if compare(event, "record-video"):
|
|
self.toggle_record()
|
|
elif compare(event, "reset-game"):
|
|
self.reset()
|
|
|
|
def toggle_record(self):
|
|
recording = not self.recording
|
|
if recording:
|
|
self.frame_length = len(self.get_string())
|
|
self.frames = TemporaryFile()
|
|
else:
|
|
self.write_frames()
|
|
self.recording = recording
|
|
|
|
def get_string(self):
|
|
return tostring(self.display_surface, self.frame_format)
|
|
|
|
def write_frames(self):
|
|
root = join(self.root, strftime(self.directory_name_format))
|
|
if not exists(root):
|
|
makedirs(root)
|
|
size = self.display_surface.get_size()
|
|
frames = self.frames
|
|
frames.seek(0)
|
|
for ii, frame in enumerate(iter(lambda: frames.read(self.frame_length),
|
|
"")):
|
|
path = join(root, "%04i.png" % ii)
|
|
save(frombuffer(frame, size, self.frame_format), path)
|
|
print "wrote video frames to " + root
|
|
|
|
def update(self):
|
|
ticks = get_ticks()
|
|
if self.recording and ticks - self.last_frame >= self.framerate:
|
|
self.frames.write(self.get_string())
|
|
self.last_frame = ticks
|