1414 BaseCameraSetConfig ,
1515 Frame ,
1616 FrameSet ,
17+ SimpleFrameRate ,
1718)
1819
1920
@@ -40,6 +41,7 @@ def __init__(self):
4041 self ._next_ring_index = 0
4142 self ._buffer_len = 0
4243 self .writer : dict [str , cv2 .VideoWriter ] = {}
44+ self .rate = SimpleFrameRate ()
4345
4446 def buffer_size (self ) -> int :
4547 return len (self ._buffer ) - self ._buffer .count (None )
@@ -91,33 +93,35 @@ def start(self, warm_up: bool = True):
9193 self ._thread = threading .Thread (target = self .polling_thread , args = (warm_up ,))
9294 self ._thread .start ()
9395
94- def record_video (self , path : Path , episode : int ):
96+ def record_video (self , path : Path , str_id : str ):
97+ if self .recording_ongoing ():
98+ return
99+ self .clear_buffer ()
95100 for camera in self .camera_names :
96101 self .writer [camera ] = cv2 .VideoWriter (
97- str (path / f"episode_{ episode } _{ camera } .mp4" ),
102+ str (path / f"episode_{ str_id } _{ camera } .mp4" ),
98103 # migh require to install ffmpeg
99104 cv2 .VideoWriter_fourcc (* "mp4v" ), # type: ignore
100105 self .config .frame_rate ,
101106 (self .config .resolution_width , self .config .resolution_height ),
102107 )
103108
109+ def recording_ongoing (self ) -> bool :
110+ with self ._buffer_lock :
111+ return len (self .writer ) > 0
112+
104113 def stop_video (self ):
105114 if len (self .writer ) > 0 :
106- for camera_key , writer in self .writer .items ():
107- for i in range (self ._next_ring_index ):
108- frameset = self ._buffer [i ]
109- assert frameset is not None
110- # rgb to bgr as expected by opencv
111- writer .write (frameset .frames [camera_key ].camera .color .data [:, :, ::- 1 ])
112- for camera in self .camera_names :
113- self .writer [camera ].release ()
114- self .writer = {}
115+ with self ._buffer_lock :
116+ for camera in self .camera_names :
117+ self .writer [camera ].release ()
118+ self .writer = {}
115119
116120 def warm_up (self ):
117121 for _ in range (self .config .warm_up_disposal_frames ):
118122 for camera_name in self .camera_names :
119123 self ._poll_frame (camera_name )
120- sleep ( 1 / self .config .frame_rate )
124+ self . rate ( self .config .frame_rate )
121125
122126 def polling_thread (self , warm_up : bool = True ):
123127 if warm_up :
@@ -126,16 +130,14 @@ def polling_thread(self, warm_up: bool = True):
126130 frame_set = self .poll_frame_set ()
127131 with self ._buffer_lock :
128132 self ._buffer [self ._next_ring_index ] = frame_set
133+ # copy the buffer to the record path
134+ for camera_key , writer in self .writer .items ():
135+ frameset = self ._buffer [self ._next_ring_index ]
136+ assert frameset is not None
137+ writer .write (frameset .frames [camera_key ].camera .color .data [:, :, ::- 1 ])
129138 self ._next_ring_index = (self ._next_ring_index + 1 ) % self .config .max_buffer_frames
130139 self ._buffer_len = max (self ._buffer_len + 1 , self .config .max_buffer_frames )
131- if self ._next_ring_index == 0 :
132- # copy the buffer to the record path
133- for camera_key , writer in self .writer .items ():
134- for i in range (self .config .max_buffer_frames ):
135- frameset = self ._buffer [i ]
136- assert frameset is not None
137- writer .write (frameset .frames [camera_key ].camera .color .data [:, :, ::- 1 ])
138- sleep (1 / self .config .frame_rate )
140+ self .rate (self .config .frame_rate )
139141
140142 def poll_frame_set (self ) -> FrameSet :
141143 """Gather frames over all available cameras."""
0 commit comments