@@ -126,6 +126,7 @@ def convert_video_to_images(
126
126
verbose : bool = False ,
127
127
image_prefix : str = "frame_" ,
128
128
keep_image_dir : bool = False ,
129
+ random_seed : Optional [int ] = None
129
130
) -> Tuple [List [str ], int ]:
130
131
"""Converts a video into a sequence of images.
131
132
@@ -177,9 +178,7 @@ def convert_video_to_images(
177
178
start_x = crop_factor [2 ]
178
179
start_y = crop_factor [0 ]
179
180
crop_cmd = f"crop=w=iw*{ width } :h=ih*{ height } :x=iw*{ start_x } :y=ih*{ start_y } ,"
180
-
181
- spacing = num_frames // num_frames_target
182
-
181
+
183
182
downscale_chains = [f"[t{ i } ]scale=iw/{ 2 ** i } :ih/{ 2 ** i } [out{ i } ]" for i in range (num_downscales + 1 )]
184
183
downscale_dirs = [Path (str (image_dir ) + (f"_{ 2 ** i } " if i > 0 else "" )) for i in range (num_downscales + 1 )]
185
184
downscale_paths = [downscale_dirs [i ] / f"{ image_prefix } %05d.png" for i in range (num_downscales + 1 )]
@@ -196,7 +195,14 @@ def convert_video_to_images(
196
195
197
196
ffmpeg_cmd += " -vsync vfr"
198
197
199
- if spacing > 1 :
198
+ # Evenly distribute frame selection if random seed does not exist
199
+ spacing = num_frames // num_frames_target
200
+ if random_seed :
201
+ random .seed (random_seed )
202
+ frame_indices = sorted (random .sample (range (num_frames ), num_frames_target ))
203
+ select_cmd = f"select=\' " + "+" .join ([f"eq(n\,{ idx } )" for idx in frame_indices ]) + "\' ,setpts=N/TB,"
204
+ CONSOLE .print (f"Extracting { num_frames_target } frames using seed-based random selection." )
205
+ elif spacing > 1 :
200
206
CONSOLE .print ("Number of frames to extract:" , math .ceil (num_frames / spacing ))
201
207
select_cmd = f"thumbnail={ spacing } ,setpts=N/TB,"
202
208
else :
0 commit comments