Skip to content

Commit fa4909d

Browse files
author
arch
committed
put skip frames to ffmpeg stream
1 parent 3a19a1a commit fa4909d

File tree

2 files changed

+12
-7
lines changed

2 files changed

+12
-7
lines changed

funscript_editor/algorithms/funscriptgenerator.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,7 @@ def tracking(self) -> str:
859859
video = FFmpegStream(
860860
video_path = self.params.video_path,
861861
config = projection_config,
862+
skip_frames = self.params.skip_frames,
862863
start_frame = self.params.start_frame
863864
)
864865

@@ -892,16 +893,12 @@ def tracking(self) -> str:
892893
while video.isOpen():
893894
cycle_start = time.time()
894895
frame = video.read()
895-
frame_num += 1
896+
frame_num += (self.params.skip_frames+1)
896897

897898
if frame is None:
898899
status = 'Reach a corrupt video frame' if video.isOpen() else 'End of video reached'
899900
break
900901

901-
# NOTE: Use != 1 to ensure that the first difference is equal to the folowing (reqired for the interpolation)
902-
if self.params.skip_frames > 0 and frame_num % (self.params.skip_frames + 1) != 1:
903-
continue
904-
905902
if self.params.end_frame > 0 and frame_num + self.params.start_frame >= self.params.end_frame:
906903
status = "Tracking stop at existing action point"
907904
break

funscript_editor/data/ffmpegstream.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class FFmpegStream:
3030
Args:
3131
video_path (str): path to video file
3232
config (dict): conversion parameter
33+
skip_frames (int): skip given number of frames between queued frames
3334
start_frame (int): start frame number
3435
queue_size (int): size of frame buffer
3536
watchdog_timeout (int): watchdog timeout in seconds
@@ -38,6 +39,7 @@ class FFmpegStream:
3839
def __init__(self,
3940
video_path :str,
4041
config :dict,
42+
skip_frames :int = 0,
4143
start_frame :int = 0,
4244
queue_size :int = 256,
4345
watchdog_timeout :int = 4):
@@ -51,6 +53,7 @@ def __init__(self,
5153
self.timeout = False
5254
self.current_frame = 0
5355
self.sleep_time = 0.001
56+
self.skip_frames = skip_frames
5457

5558
self.video_info = self.get_video_info(video_path)
5659
self.frame_buffer = Queue(maxsize=queue_size)
@@ -357,12 +360,18 @@ def run(self) -> None:
357360
if frame is None:
358361
break
359362

363+
self.current_frame += 1
364+
365+
# NOTE: Use != 1 to ensure that the first difference is equal to the folowing (reqired for the interpolation)
366+
if self.skip_frames > 0 and self.current_frame % (self.skip_frames + 1) != 1:
367+
continue
368+
360369
wait_counter = 0
361370
while self.frame_buffer.full() and not self.stopped:
362371
self.watchdog.trigger()
363372
time.sleep(self.sleep_time)
364373
wait_counter += 1
365-
if self.current_frame - self.queue_size > 2 and wait_counter == 2500:
374+
if self.current_frame - (self.skip_frames + 1)*self.queue_size > 3 and wait_counter == 2500:
366375
self.logger.error("FFmpeg Frame Buffer overrun!!!")
367376

368377
if 'zoom' in self.config.keys():
@@ -375,7 +384,6 @@ def run(self) -> None:
375384
frame = cv2.resize(frame, self.config['resize'])
376385

377386
self.frame_buffer.put(frame)
378-
self.current_frame += 1
379387

380388
self.stopped = True
381389
self.logger.info('Close FFmpeg Stream')

0 commit comments

Comments
 (0)