@@ -29,6 +29,9 @@ class VecVideoRecorder(VecEnvWrapper):
2929 :param name_prefix: Prefix to the video name
3030 """
3131
32+ video_name : str
33+ video_path : str
34+
3235 def __init__ (
3336 self ,
3437 venv : VecEnv ,
@@ -50,7 +53,7 @@ def __init__(
5053
5154 if isinstance (temp_env , DummyVecEnv ) or isinstance (temp_env , SubprocVecEnv ):
5255 metadata = temp_env .get_attr ("metadata" )[0 ]
53- else :
56+ else : # pragma: no cover # assume gym interface
5457 metadata = temp_env .metadata
5558
5659 self .env .metadata = metadata
@@ -67,15 +70,12 @@ def __init__(
6770 self .step_id = 0
6871 self .video_length = video_length
6972
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-
7373 self .recording = False
7474 self .recorded_frames : list [np .ndarray ] = []
7575
7676 try :
7777 import moviepy # noqa: F401
78- except ImportError as e :
78+ except ImportError as e : # pragma: no cover
7979 raise error .DependencyNotInstalled ("MoviePy is not installed, run `pip install 'gymnasium[other]'`" ) from e
8080
8181 def reset (self ) -> VecEnvObs :
@@ -85,6 +85,9 @@ def reset(self) -> VecEnvObs:
8585 return obs
8686
8787 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 )
8891 self ._start_recording ()
8992 self ._capture_frame ()
9093
@@ -109,8 +112,6 @@ def _capture_frame(self) -> None:
109112 assert self .recording , "Cannot capture a frame, recording wasn't started."
110113
111114 frame = self .env .render ()
112- if isinstance (frame , list ):
113- frame = frame [- 1 ]
114115
115116 if isinstance (frame , np .ndarray ):
116117 self .recorded_frames .append (frame )
@@ -123,12 +124,12 @@ def _capture_frame(self) -> None:
123124 def close (self ) -> None :
124125 """Closes the wrapper then the video recorder."""
125126 VecEnvWrapper .close (self )
126- if self .recording :
127+ if self .recording : # pragma: no cover
127128 self ._stop_recording ()
128129
129130 def _start_recording (self ) -> None :
130131 """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
132133 self ._stop_recording ()
133134
134135 self .recording = True
@@ -137,7 +138,7 @@ def _stop_recording(self) -> None:
137138 """Stop current recording and saves the video."""
138139 assert self .recording , "_stop_recording was called, but no recording was started"
139140
140- if len (self .recorded_frames ) == 0 :
141+ if len (self .recorded_frames ) == 0 : # pragma: no cover
141142 logger .warn ("Ignored saving a video as there were zero frames to save." )
142143 else :
143144 from moviepy .video .io .ImageSequenceClip import ImageSequenceClip
@@ -150,5 +151,5 @@ def _stop_recording(self) -> None:
150151
151152 def __del__ (self ) -> None :
152153 """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
154155 logger .warn ("Unable to save last video! Did you call close()?" )
0 commit comments