@@ -29,6 +29,9 @@ class VecVideoRecorder(VecEnvWrapper):
29
29
:param name_prefix: Prefix to the video name
30
30
"""
31
31
32
+ video_name : str
33
+ video_path : str
34
+
32
35
def __init__ (
33
36
self ,
34
37
venv : VecEnv ,
@@ -50,7 +53,7 @@ def __init__(
50
53
51
54
if isinstance (temp_env , DummyVecEnv ) or isinstance (temp_env , SubprocVecEnv ):
52
55
metadata = temp_env .get_attr ("metadata" )[0 ]
53
- else :
56
+ else : # pragma: no cover # assume gym interface
54
57
metadata = temp_env .metadata
55
58
56
59
self .env .metadata = metadata
@@ -67,15 +70,12 @@ def __init__(
67
70
self .step_id = 0
68
71
self .video_length = video_length
69
72
70
- self .video_name = f"{ self .name_prefix } -step-{ self .step_id } -to-step-{ self .step_id + self .video_length } .mp4"
71
- self .video_path = os .path .join (self .video_folder , self .video_name )
72
-
73
73
self .recording = False
74
74
self .recorded_frames : list [np .ndarray ] = []
75
75
76
76
try :
77
77
import moviepy # noqa: F401
78
- except ImportError as e :
78
+ except ImportError as e : # pragma: no cover
79
79
raise error .DependencyNotInstalled ("MoviePy is not installed, run `pip install 'gymnasium[other]'`" ) from e
80
80
81
81
def reset (self ) -> VecEnvObs :
@@ -85,6 +85,9 @@ def reset(self) -> VecEnvObs:
85
85
return obs
86
86
87
87
def _start_video_recorder (self ) -> None :
88
+ # Update video name and path
89
+ self .video_name = f"{ self .name_prefix } -step-{ self .step_id } -to-step-{ self .step_id + self .video_length } .mp4"
90
+ self .video_path = os .path .join (self .video_folder , self .video_name )
88
91
self ._start_recording ()
89
92
self ._capture_frame ()
90
93
@@ -109,8 +112,6 @@ def _capture_frame(self) -> None:
109
112
assert self .recording , "Cannot capture a frame, recording wasn't started."
110
113
111
114
frame = self .env .render ()
112
- if isinstance (frame , list ):
113
- frame = frame [- 1 ]
114
115
115
116
if isinstance (frame , np .ndarray ):
116
117
self .recorded_frames .append (frame )
@@ -123,12 +124,12 @@ def _capture_frame(self) -> None:
123
124
def close (self ) -> None :
124
125
"""Closes the wrapper then the video recorder."""
125
126
VecEnvWrapper .close (self )
126
- if self .recording :
127
+ if self .recording : # pragma: no cover
127
128
self ._stop_recording ()
128
129
129
130
def _start_recording (self ) -> None :
130
131
"""Start a new recording. If it is already recording, stops the current recording before starting the new one."""
131
- if self .recording :
132
+ if self .recording : # pragma: no cover
132
133
self ._stop_recording ()
133
134
134
135
self .recording = True
@@ -137,7 +138,7 @@ def _stop_recording(self) -> None:
137
138
"""Stop current recording and saves the video."""
138
139
assert self .recording , "_stop_recording was called, but no recording was started"
139
140
140
- if len (self .recorded_frames ) == 0 :
141
+ if len (self .recorded_frames ) == 0 : # pragma: no cover
141
142
logger .warn ("Ignored saving a video as there were zero frames to save." )
142
143
else :
143
144
from moviepy .video .io .ImageSequenceClip import ImageSequenceClip
@@ -150,5 +151,5 @@ def _stop_recording(self) -> None:
150
151
151
152
def __del__ (self ) -> None :
152
153
"""Warn the user in case last video wasn't saved."""
153
- if len (self .recorded_frames ) > 0 :
154
+ if len (self .recorded_frames ) > 0 : # pragma: no cover
154
155
logger .warn ("Unable to save last video! Did you call close()?" )
0 commit comments