From 167db9f9a5bbd08c7070d4e39383f2d355191b93 Mon Sep 17 00:00:00 2001 From: neitzal Date: Wed, 19 Apr 2017 14:51:22 +0200 Subject: [PATCH] Fix issue #464, repeated/skipped frames in ImageSequenceClip (#494) * Fix issue 464, repeated/skipped frames in ImageSequenceClip * Add test for issue #464, repeated/skipped frames of ImageSequenceClip --- moviepy/video/io/ImageSequenceClip.py | 4 +++- tests/test_issues.py | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/moviepy/video/io/ImageSequenceClip.py b/moviepy/video/io/ImageSequenceClip.py index 7aa50bd09..d6b9d4621 100644 --- a/moviepy/video/io/ImageSequenceClip.py +++ b/moviepy/video/io/ImageSequenceClip.py @@ -78,8 +78,10 @@ def __init__(self, sequence, fps=None, durations=None, with_mask=True, self.fps = fps if fps is not None: durations = [1.0/fps for image in sequence] + self.images_starts = [1.0*i/fps-np.finfo(np.float32).eps for i in range(len(sequence))] + else: + self.images_starts = [0]+list(np.cumsum(durations)) self.durations = durations - self.images_starts = [0]+list(np.cumsum(durations)) self.duration = sum(durations) self.end = self.duration self.sequence = sequence diff --git a/tests/test_issues.py b/tests/test_issues.py index a854d9c40..8eeccf006 100644 --- a/tests/test_issues.py +++ b/tests/test_issues.py @@ -186,6 +186,15 @@ def test_issue_417(): final = CompositeVideoClip([myclip], size=(1280, 720)) #final.set_duration(7).write_videofile("test.mp4", fps=30) +def test_issue_464(): + import numpy as np + original_frames = [i*np.ones((32, 32, 3), dtype=np.uint8) for i in range(50)] + clip = ImageSequenceClip(original_frames, fps=30) + for original_frame, clip_frame in zip(original_frames, clip.iter_frames()): + # The retrieved frames should be equal to the original ones + # Since the frames are constant color, it suffices to compare one pixel + assert original_frame[0,0,0] == clip_frame[0,0,0] + def test_issue_467(): cad = 'media/python_logo.png' clip = ImageClip(cad)