From 8fc03f6c49853662fc73c37c2995643ff9cbde41 Mon Sep 17 00:00:00 2001 From: zalgo Date: Mon, 30 Jan 2023 11:51:34 +0900 Subject: [PATCH 1/9] Use audio_codec option even if audio is given as filename --- moviepy/video/VideoClip.py | 2 ++ moviepy/video/io/ffmpeg_writer.py | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/moviepy/video/VideoClip.py b/moviepy/video/VideoClip.py index 76e19e47a..6584f4274 100644 --- a/moviepy/video/VideoClip.py +++ b/moviepy/video/VideoClip.py @@ -376,6 +376,7 @@ def write_videofile( write_logfile=write_logfile, logger=logger, ) + audio_codec = "copy" ffmpeg_write_video( self, @@ -386,6 +387,7 @@ def write_videofile( preset=preset, write_logfile=write_logfile, audiofile=audiofile, + audio_codec=audio_codec, threads=threads, ffmpeg_params=ffmpeg_params, logger=logger, diff --git a/moviepy/video/io/ffmpeg_writer.py b/moviepy/video/io/ffmpeg_writer.py index 7032be0af..6544f61b9 100644 --- a/moviepy/video/io/ffmpeg_writer.py +++ b/moviepy/video/io/ffmpeg_writer.py @@ -44,6 +44,9 @@ class FFMPEG_VideoWriter: audiofile : str, optional The name of an audio file that will be incorporated to the video. + audio_codec : str, optional + FFMPEG audio codec. + preset : str, optional Sets the time that FFMPEG will take to compress the video. The slower, the better the compression rate. Possibilities are: ``"ultrafast"``, @@ -119,7 +122,9 @@ def __init__( "-", ] if audiofile is not None: - cmd.extend(["-i", audiofile, "-acodec", "copy"]) + if audio_codec is None: + audio_codec = "copy" + cmd.extend(["-i", audiofile, "-acodec", audio_codec]) cmd.extend(["-vcodec", codec, "-preset", preset]) if ffmpeg_params is not None: cmd.extend(ffmpeg_params) @@ -226,6 +231,7 @@ def ffmpeg_write_video( with_mask=False, write_logfile=False, audiofile=None, + audio_codec=None, threads=None, ffmpeg_params=None, logger="bar", @@ -252,6 +258,7 @@ def ffmpeg_write_video( bitrate=bitrate, logfile=logfile, audiofile=audiofile, + audio_codec=audio_codec, threads=threads, ffmpeg_params=ffmpeg_params, pixel_format=pixel_format, From 83b019f10b3b02d697ec8df488cb601846a92707 Mon Sep 17 00:00:00 2001 From: zalgo Date: Mon, 30 Jan 2023 12:04:18 +0900 Subject: [PATCH 2/9] Add an extra explanation to the docstring --- moviepy/video/io/ffmpeg_writer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/moviepy/video/io/ffmpeg_writer.py b/moviepy/video/io/ffmpeg_writer.py index 6544f61b9..7568d1d92 100644 --- a/moviepy/video/io/ffmpeg_writer.py +++ b/moviepy/video/io/ffmpeg_writer.py @@ -45,7 +45,7 @@ class FFMPEG_VideoWriter: The name of an audio file that will be incorporated to the video. audio_codec : str, optional - FFMPEG audio codec. + FFMPEG audio codec. If None, ``"copy"`` codec is used. preset : str, optional Sets the time that FFMPEG will take to compress the video. The slower, From c4f8fefefcb3442a95807606777e157d37eada34 Mon Sep 17 00:00:00 2001 From: zalgo Date: Mon, 30 Jan 2023 12:07:08 +0900 Subject: [PATCH 3/9] Add a comment --- moviepy/video/VideoClip.py | 1 + 1 file changed, 1 insertion(+) diff --git a/moviepy/video/VideoClip.py b/moviepy/video/VideoClip.py index 6584f4274..d6506ce6a 100644 --- a/moviepy/video/VideoClip.py +++ b/moviepy/video/VideoClip.py @@ -376,6 +376,7 @@ def write_videofile( write_logfile=write_logfile, logger=logger, ) + # The audio is already encoded, so there is no need to encode it during video export audio_codec = "copy" ffmpeg_write_video( From 89c5fce5597195d7bb9a5b5bed5eb5c95567956b Mon Sep 17 00:00:00 2001 From: zalgo Date: Mon, 30 Jan 2023 13:54:22 +0900 Subject: [PATCH 4/9] Add an argument audio_codec to FFMPEG_VideoWriter.__init__ --- moviepy/video/io/ffmpeg_writer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/moviepy/video/io/ffmpeg_writer.py b/moviepy/video/io/ffmpeg_writer.py index 7568d1d92..b602364c5 100644 --- a/moviepy/video/io/ffmpeg_writer.py +++ b/moviepy/video/io/ffmpeg_writer.py @@ -84,6 +84,7 @@ def __init__( fps, codec="libx264", audiofile=None, + audio_codec=None, preset="medium", bitrate=None, with_mask=False, From 8fd8d87fd3af3817fc78cc2600ff4810d7dda02c Mon Sep 17 00:00:00 2001 From: zalgo Date: Mon, 30 Jan 2023 22:18:47 +0900 Subject: [PATCH 5/9] Fix the error message and modify/add tests --- moviepy/video/io/ffmpeg_writer.py | 7 ++++--- tests/test_VideoClip.py | 20 ++++++++++++++++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/moviepy/video/io/ffmpeg_writer.py b/moviepy/video/io/ffmpeg_writer.py index b602364c5..694d580cf 100644 --- a/moviepy/video/io/ffmpeg_writer.py +++ b/moviepy/video/io/ffmpeg_writer.py @@ -98,6 +98,7 @@ def __init__( self.logfile = logfile self.filename = filename self.codec = codec + self.audio_codec = audio_codec self.ext = self.filename.split(".")[-1] if not pixel_format: # pragma: no cover pixel_format = "rgba" if with_mask else "rgb24" @@ -164,13 +165,13 @@ def write_frame(self, img_array): f"writing file {self.filename}:\n\n {ffmpeg_error}" ) - if "Unknown encoder" in ffmpeg_error: + if "Unknown encoder" in ffmpeg_error or "Unknown decoder" in ffmpeg_error: error += ( "\n\nThe video export failed because FFMPEG didn't find the " - f"specified codec for video encoding {self.codec}. " + f"specified codec for video or audio. " "Please install this codec or change the codec when calling " "write_videofile.\nFor instance:\n" - " >>> clip.write_videofile('myvid.webm', codec='libvpx')" + " >>> clip.write_videofile('myvid.webm', audio='myaudio.mp3', codec='libvpx', audio_codec='aac')" ) elif "incorrect codec parameters ?" in ffmpeg_error: diff --git a/tests/test_VideoClip.py b/tests/test_VideoClip.py index 4e2d1abbc..ddc2f8380 100644 --- a/tests/test_VideoClip.py +++ b/tests/test_VideoClip.py @@ -72,7 +72,7 @@ def test_write_frame_errors(util, video): clip.write_videofile(location, codec="nonexistent-codec") assert ( "The video export failed because FFMPEG didn't find the specified" - " codec for video encoding nonexistent-codec" in str(e.value) + " codec for video or audio" in str(e.value) ), e.value autogenerated_location = "unlogged-writeTEMP_MPY_wvf_snd.mp3" @@ -90,7 +90,7 @@ def test_write_frame_errors_with_redirected_logs(util, video): clip.write_videofile(location, codec="nonexistent-codec", write_logfile=True) assert ( "The video export failed because FFMPEG didn't find the specified" - " codec for video encoding nonexistent-codec" in str(e.value) + " codec for video or audio" in str(e.value) ) autogenerated_location_mp3 = "logged-writeTEMP_MPY_wvf_snd.mp3" @@ -112,6 +112,22 @@ def test_write_videofiles_with_temp_audiofile_path(util): assert any(file.startswith("temp_audiofile_path") for file in contents_of_temp_dir) +def test_write_videofiles_audio_codec_error(util, video): + """Checks error cases return helpful messages.""" + clip = video() + location = os.path.join(util.TMP_DIR, "unlogged-write.mp4") + with pytest.raises(IOError) as e: + clip.write_videofile(location, audio="media/crunching.mp3", audio_codec="nonexistent-codec") + assert ( + "The video export failed because FFMPEG didn't find the specified" + " codec for video or audio" in str(e.value) + ), e.value + + autogenerated_location = "unlogged-writeTEMP_MPY_wvf_snd.mp3" + if os.path.exists(autogenerated_location): + os.remove(autogenerated_location) + + @pytest.mark.parametrize("mask_color", (0, 0.5, 0.8, 1)) @pytest.mark.parametrize( "with_mask", From c629ebe2fd6288c6d7f68e21f5fd4642d8c5d4cc Mon Sep 17 00:00:00 2001 From: zalgo Date: Tue, 7 Feb 2023 09:13:34 +0900 Subject: [PATCH 6/9] Apply black formatter --- tests/test_VideoClip.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_VideoClip.py b/tests/test_VideoClip.py index ddc2f8380..1807279a6 100644 --- a/tests/test_VideoClip.py +++ b/tests/test_VideoClip.py @@ -117,7 +117,9 @@ def test_write_videofiles_audio_codec_error(util, video): clip = video() location = os.path.join(util.TMP_DIR, "unlogged-write.mp4") with pytest.raises(IOError) as e: - clip.write_videofile(location, audio="media/crunching.mp3", audio_codec="nonexistent-codec") + clip.write_videofile( + location, audio="media/crunching.mp3", audio_codec="nonexistent-codec" + ) assert ( "The video export failed because FFMPEG didn't find the specified" " codec for video or audio" in str(e.value) From 419548a9a6f5833b1d94869b18d6bb5e6a47b0e9 Mon Sep 17 00:00:00 2001 From: zalgo Date: Tue, 7 Feb 2023 09:37:48 +0900 Subject: [PATCH 7/9] fix comment break lines --- moviepy/video/VideoClip.py | 3 ++- moviepy/video/io/ffmpeg_writer.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/moviepy/video/VideoClip.py b/moviepy/video/VideoClip.py index d6506ce6a..8b3a68e29 100644 --- a/moviepy/video/VideoClip.py +++ b/moviepy/video/VideoClip.py @@ -376,7 +376,8 @@ def write_videofile( write_logfile=write_logfile, logger=logger, ) - # The audio is already encoded, so there is no need to encode it during video export + # The audio is already encoded, + # so there is no need to encode it during video export audio_codec = "copy" ffmpeg_write_video( diff --git a/moviepy/video/io/ffmpeg_writer.py b/moviepy/video/io/ffmpeg_writer.py index 694d580cf..05fbcf153 100644 --- a/moviepy/video/io/ffmpeg_writer.py +++ b/moviepy/video/io/ffmpeg_writer.py @@ -171,7 +171,8 @@ def write_frame(self, img_array): f"specified codec for video or audio. " "Please install this codec or change the codec when calling " "write_videofile.\nFor instance:\n" - " >>> clip.write_videofile('myvid.webm', audio='myaudio.mp3', codec='libvpx', audio_codec='aac')" + " >>> clip.write_videofile('myvid.webm', audio='myaudio.mp3', " + "codec='libvpx', audio_codec='aac')" ) elif "incorrect codec parameters ?" in ffmpeg_error: From 5635b97f3e57e9b4c0403924a500a822637eefd5 Mon Sep 17 00:00:00 2001 From: zalgo Date: Fri, 10 Feb 2023 14:08:15 +0900 Subject: [PATCH 8/9] fix flake8 error --- moviepy/video/io/ffmpeg_writer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/moviepy/video/io/ffmpeg_writer.py b/moviepy/video/io/ffmpeg_writer.py index 05fbcf153..cff303ad7 100644 --- a/moviepy/video/io/ffmpeg_writer.py +++ b/moviepy/video/io/ffmpeg_writer.py @@ -168,7 +168,7 @@ def write_frame(self, img_array): if "Unknown encoder" in ffmpeg_error or "Unknown decoder" in ffmpeg_error: error += ( "\n\nThe video export failed because FFMPEG didn't find the " - f"specified codec for video or audio. " + "specified codec for video or audio. " "Please install this codec or change the codec when calling " "write_videofile.\nFor instance:\n" " >>> clip.write_videofile('myvid.webm', audio='myaudio.mp3', " From 34516a6dccf8becf0e0d2b4e934ea0a77a4c2990 Mon Sep 17 00:00:00 2001 From: zalgo3 Date: Wed, 22 Feb 2023 10:36:16 +0900 Subject: [PATCH 9/9] Apply black --- moviepy/Clip.py | 6 ------ moviepy/audio/AudioClip.py | 1 - moviepy/audio/io/AudioFileClip.py | 1 - moviepy/audio/io/readers.py | 1 - moviepy/config.py | 1 - moviepy/video/VideoClip.py | 3 --- moviepy/video/compositing/CompositeVideoClip.py | 1 - moviepy/video/fx/freeze_region.py | 2 -- moviepy/video/fx/resize.py | 2 -- moviepy/video/io/ImageSequenceClip.py | 7 ------- moviepy/video/io/VideoFileClip.py | 4 ---- moviepy/video/io/ffmpeg_reader.py | 2 -- moviepy/video/io/ffmpeg_writer.py | 2 -- moviepy/video/io/gif_writers.py | 7 ------- moviepy/video/io/preview.py | 1 - moviepy/video/tools/cuts.py | 8 +++----- moviepy/video/tools/interpolators.py | 2 -- moviepy/video/tools/subtitles.py | 1 - moviepy/video/tools/tracking.py | 4 ---- tests/test_VideoFileClip.py | 2 +- tests/test_ffmpeg_reader.py | 1 - tests/test_ffmpeg_writer.py | 1 - tests/test_fx.py | 1 - tests/test_issues.py | 1 - tests/test_videotools.py | 1 - 25 files changed, 4 insertions(+), 59 deletions(-) diff --git a/moviepy/Clip.py b/moviepy/Clip.py index 69eb0d817..73ebdfadc 100644 --- a/moviepy/Clip.py +++ b/moviepy/Clip.py @@ -43,7 +43,6 @@ class Clip: _TEMP_FILES_PREFIX = "TEMP_MPY_" def __init__(self): - self.start = 0 self.end = None self.duration = None @@ -375,7 +374,6 @@ def is_playing(self, t): return result else: - return (t >= self.start) and ((self.end is None) or (t < self.end)) @convert_parameter_to_seconds(["start_time", "end_time"]) @@ -424,11 +422,9 @@ def subclip(self, start_time=0, end_time=None): new_clip = self.time_transform(lambda t: t + start_time, apply_to=[]) if (end_time is None) and (self.duration is not None): - end_time = self.duration elif (end_time is not None) and (end_time < 0): - if self.duration is None: raise ValueError( ( @@ -439,11 +435,9 @@ def subclip(self, start_time=0, end_time=None): ) else: - end_time = self.duration + end_time if end_time is not None: - new_clip.duration = end_time - start_time new_clip.end = new_clip.start + new_clip.duration diff --git a/moviepy/audio/AudioClip.py b/moviepy/audio/AudioClip.py index b3110984f..e36cebde5 100644 --- a/moviepy/audio/AudioClip.py +++ b/moviepy/audio/AudioClip.py @@ -279,7 +279,6 @@ class AudioArrayClip(AudioClip): """ def __init__(self, array, fps): - Clip.__init__(self) self.array = array self.fps = fps diff --git a/moviepy/audio/io/AudioFileClip.py b/moviepy/audio/io/AudioFileClip.py index 4ab79b407..dd241f84a 100644 --- a/moviepy/audio/io/AudioFileClip.py +++ b/moviepy/audio/io/AudioFileClip.py @@ -57,7 +57,6 @@ class AudioFileClip(AudioClip): def __init__( self, filename, decode_file=False, buffersize=200000, nbytes=2, fps=44100 ): - AudioClip.__init__(self) self.filename = filename diff --git a/moviepy/audio/io/readers.py b/moviepy/audio/io/readers.py index c714c69d6..4f60efb44 100644 --- a/moviepy/audio/io/readers.py +++ b/moviepy/audio/io/readers.py @@ -216,7 +216,6 @@ def get_frame(self, tt): return result else: - ind = int(self.fps * tt) if ind < 0 or ind > self.n_frames: # out of time: return 0 return np.zeros(self.nchannels) diff --git a/moviepy/config.py b/moviepy/config.py index 90d9282de..1ba214f16 100644 --- a/moviepy/config.py +++ b/moviepy/config.py @@ -44,7 +44,6 @@ def try_cmd(cmd): FFMPEG_BINARY = get_exe() elif FFMPEG_BINARY == "auto-detect": - if try_cmd(["ffmpeg"])[0]: FFMPEG_BINARY = "ffmpeg" elif not IS_POSIX_OS and try_cmd(["ffmpeg.exe"])[0]: diff --git a/moviepy/video/VideoClip.py b/moviepy/video/VideoClip.py index 8b3a68e29..89af5c559 100644 --- a/moviepy/video/VideoClip.py +++ b/moviepy/video/VideoClip.py @@ -327,7 +327,6 @@ def write_videofile( logger = proglog.default_bar_logger(logger) if codec is None: - try: codec = extensions_dict[ext]["codec"][0] except KeyError: @@ -1048,7 +1047,6 @@ def __init__( img = imread(img) if len(img.shape) == 3: # img is (now) a RGB(a) numpy array - if img.shape[2] == 4: if fromalpha: img = 1.0 * img[:, :, 3] / 255 @@ -1248,7 +1246,6 @@ def __init__( remove_temp=True, print_cmd=False, ): - if text is not None: if temptxt is None: temptxt_fd, temptxt = tempfile.mkstemp(suffix=".txt") diff --git a/moviepy/video/compositing/CompositeVideoClip.py b/moviepy/video/compositing/CompositeVideoClip.py index cb3c6b711..fec0b0d29 100644 --- a/moviepy/video/compositing/CompositeVideoClip.py +++ b/moviepy/video/compositing/CompositeVideoClip.py @@ -54,7 +54,6 @@ class CompositeVideoClip(VideoClip): def __init__( self, clips, size=None, bg_color=None, use_bgclip=False, is_mask=False ): - if size is None: size = clips[0].size diff --git a/moviepy/video/fx/freeze_region.py b/moviepy/video/fx/freeze_region.py index 6726c4c05..a067ccfed 100644 --- a/moviepy/video/fx/freeze_region.py +++ b/moviepy/video/fx/freeze_region.py @@ -29,7 +29,6 @@ def freeze_region(clip, t=0, region=None, outside_region=None, mask=None): """ if region is not None: - x1, y1, x2, y2 = region freeze = ( clip.fx(crop, *region) @@ -40,7 +39,6 @@ def freeze_region(clip, t=0, region=None, outside_region=None, mask=None): return CompositeVideoClip([clip, freeze]) elif outside_region is not None: - x1, y1, x2, y2 = outside_region animated_region = clip.fx(crop, *outside_region).with_position((x1, y1)) freeze = clip.to_ImageClip(t=t).with_duration(clip.duration) diff --git a/moviepy/video/fx/resize.py b/moviepy/video/fx/resize.py index 843472cd4..1476fbb7d 100644 --- a/moviepy/video/fx/resize.py +++ b/moviepy/video/fx/resize.py @@ -191,7 +191,6 @@ def filter(get_frame, t): new_size = translate_new_size(new_size) elif height is not None: - if hasattr(height, "__call__"): def func(t): @@ -203,7 +202,6 @@ def func(t): new_size = [w * height / h, height] elif width is not None: - if hasattr(width, "__call__"): def func(t): diff --git a/moviepy/video/io/ImageSequenceClip.py b/moviepy/video/io/ImageSequenceClip.py index fd939c49a..930a6feff 100644 --- a/moviepy/video/io/ImageSequenceClip.py +++ b/moviepy/video/io/ImageSequenceClip.py @@ -49,7 +49,6 @@ def __init__( is_mask=False, load_images=False, ): - # CODE WRITTEN AS IT CAME, MAY BE IMPROVED IN THE FUTURE if (fps is None) and (durations is None): @@ -111,12 +110,10 @@ def find_image_index(t): ) if fromfiles: - self.last_index = None self.last_image = None def make_frame(t): - index = find_image_index(t) if index != self.last_index: @@ -126,13 +123,11 @@ def make_frame(t): return self.last_image if with_mask and (imread(self.sequence[0]).shape[2] == 4): - self.mask = VideoClip(is_mask=True) self.mask.last_index = None self.mask.last_image = None def mask_make_frame(t): - index = find_image_index(t) if index != self.mask.last_index: frame = imread(self.sequence[index])[:, :, 3] @@ -147,12 +142,10 @@ def mask_make_frame(t): else: def make_frame(t): - index = find_image_index(t) return self.sequence[index][:, :, :3] if with_mask and (self.sequence[0].shape[2] == 4): - self.mask = VideoClip(is_mask=True) def mask_make_frame(t): diff --git a/moviepy/video/io/VideoFileClip.py b/moviepy/video/io/VideoFileClip.py index 1be47cb45..f18cff612 100644 --- a/moviepy/video/io/VideoFileClip.py +++ b/moviepy/video/io/VideoFileClip.py @@ -96,7 +96,6 @@ def __init__( fps_source="fps", pixel_format=None, ): - VideoClip.__init__(self) # Make a reader @@ -122,7 +121,6 @@ def __init__( self.filename = filename if has_mask: - self.make_frame = lambda t: self.reader.get_frame(t)[:, :, :3] def mask_make_frame(t): @@ -134,12 +132,10 @@ def mask_make_frame(t): self.mask.fps = self.fps else: - self.make_frame = lambda t: self.reader.get_frame(t) # Make a reader for the audio, if any. if audio and self.reader.infos["audio_found"]: - self.audio = AudioFileClip( filename, buffersize=audio_buffersize, diff --git a/moviepy/video/io/ffmpeg_reader.py b/moviepy/video/io/ffmpeg_reader.py index 616deff6b..b7be97177 100644 --- a/moviepy/video/io/ffmpeg_reader.py +++ b/moviepy/video/io/ffmpeg_reader.py @@ -25,7 +25,6 @@ def __init__( resize_algo="bicubic", fps_source="fps", ): - self.filename = filename self.proc = None infos = ffmpeg_parse_infos( @@ -577,7 +576,6 @@ def parse(self): # not default audio found, assume first audio stream is the default if self.result["audio_found"] and not self.result.get("audio_bitrate"): - self.result["audio_bitrate"] = None for streams_input in self.result["inputs"]: for stream in streams_input["streams"]: diff --git a/moviepy/video/io/ffmpeg_writer.py b/moviepy/video/io/ffmpeg_writer.py index cff303ad7..827724cdc 100644 --- a/moviepy/video/io/ffmpeg_writer.py +++ b/moviepy/video/io/ffmpeg_writer.py @@ -190,14 +190,12 @@ def write_frame(self, img_array): ) elif "bitrate not specified" in ffmpeg_error: - error += ( "\n\nThe video export failed, possibly because the bitrate " "specified was too high or too low for the video codec." ) elif "Invalid encoder type" in ffmpeg_error: - error += ( "\n\nThe video export failed because the codec " "or file extension you provided is not suitable for video" diff --git a/moviepy/video/io/gif_writers.py b/moviepy/video/io/gif_writers.py index b052bcecb..f4240139b 100644 --- a/moviepy/video/io/gif_writers.py +++ b/moviepy/video/io/gif_writers.py @@ -101,7 +101,6 @@ def write_gif_with_tempfiles( logger(message="MoviePy - - Generating GIF frames") for i, t in logger.iter_bar(t=list(enumerate(tt))): - name = "%s_GIFTEMP%04d.png" % (file_root, i + 1) tempfiles.append(name) clip.save_frame(name, t, with_mask=True) @@ -167,7 +166,6 @@ def write_gif_with_tempfiles( logger(message="MoviePy - GIF ready: %s." % filename) except (IOError, OSError) as err: - error = ( "MoviePy Error: creation of %s failed because " "of the following error:\n\n%s.\n\n." % (filename, str(err)) @@ -335,7 +333,6 @@ def write_gif( **popen_params, ) else: - popen_params["stdin"] = sp.PIPE popen_params["stdout"] = sp.PIPE @@ -344,7 +341,6 @@ def write_gif( ) if program == "ImageMagick": - cmd2 = [ IMAGEMAGICK_BINARY, "-delay", @@ -368,7 +364,6 @@ def write_gif( proc2 = sp.Popen(cmd2 + ["gif:-"], **popen_params) if opt: - cmd3 = ( [ IMAGEMAGICK_BINARY, @@ -399,7 +394,6 @@ def write_gif( proc1.stdin.write(frame.tobytes()) except IOError as err: - error = ( "[MoviePy] Error: creation of %s failed because " "of the following error:\n\n%s.\n\n." % (filename, str(err)) @@ -450,5 +444,4 @@ def write_gif_with_image_io( logger(message="MoviePy - Building file %s with imageio." % filename) for frame in clip.iter_frames(fps=fps, logger=logger, dtype="uint8"): - writer.append_data(frame) diff --git a/moviepy/video/io/preview.py b/moviepy/video/io/preview.py index 30ac4c428..c936726fe 100644 --- a/moviepy/video/io/preview.py +++ b/moviepy/video/io/preview.py @@ -159,7 +159,6 @@ def preview( t0 = time.time() for t in np.arange(1.0 / fps, clip.duration - 0.001, 1.0 / fps): - img = clip.get_frame(t) for event in pg.event.get(): diff --git a/moviepy/video/tools/cuts.py b/moviepy/video/tools/cuts.py index 40ff5fca3..1bf4e6cc6 100644 --- a/moviepy/video/tools/cuts.py +++ b/moviepy/video/tools/cuts.py @@ -253,8 +253,7 @@ def distance(t1, t2): matching_frames = [] # the final result. - for (t, frame) in clip.iter_frames(with_times=True, logger=logger): - + for t, frame in clip.iter_frames(with_times=True, logger=logger): flat_frame = 1.0 * frame.flatten() F_norm_sq = dot_product(flat_frame, flat_frame) F_norm = np.sqrt(F_norm_sq) @@ -359,7 +358,7 @@ def select_scenes( nomatch_threshold = match_threshold dict_starts = defaultdict(lambda: []) - for (start, end, min_distance, max_distance) in self: + for start, end, min_distance, max_distance in self: dict_starts[start].append([end, min_distance, max_distance]) starts_ends = sorted(dict_starts.items(), key=lambda k: k[0]) @@ -367,7 +366,6 @@ def select_scenes( result = [] min_start = 0 for start, ends_distances in starts_ends: - if start < min_start: continue @@ -445,7 +443,7 @@ def write_gifs(self, clip, gifs_dir, **kwargs): MoviePy - Building file foo/00000128_00000372.gif with imageio. MoviePy - Building file foo/00000140_00000360.gif with imageio. """ - for (start, end, _, _) in self: + for start, end, _, _ in self: name = "%s/%08d_%08d.gif" % (gifs_dir, 100 * start, 100 * end) clip.subclip(start, end).write_gif(name, **kwargs) diff --git a/moviepy/video/tools/interpolators.py b/moviepy/video/tools/interpolators.py index 83db3be3d..268ad3a64 100644 --- a/moviepy/video/tools/interpolators.py +++ b/moviepy/video/tools/interpolators.py @@ -38,7 +38,6 @@ class Interpolator: """ def __init__(self, tt=None, ss=None, ttss=None, left=None, right=None): - if ttss is not None: tt, ss = zip(*ttss) @@ -88,7 +87,6 @@ class Trajectory: """ def __init__(self, tt, xx, yy): - self.tt = 1.0 * np.array(tt) self.xx = np.array(xx) self.yy = np.array(yy) diff --git a/moviepy/video/tools/subtitles.py b/moviepy/video/tools/subtitles.py index b2a9b841f..0b676d6ef 100644 --- a/moviepy/video/tools/subtitles.py +++ b/moviepy/video/tools/subtitles.py @@ -43,7 +43,6 @@ class SubtitlesClip(VideoClip): """ def __init__(self, subtitles, make_textclip=None, encoding=None): - VideoClip.__init__(self, has_constant_size=False) if not isinstance(subtitles, list): diff --git a/moviepy/video/tools/tracking.py b/moviepy/video/tools/tracking.py index 8546074bc..ab0df233f 100644 --- a/moviepy/video/tools/tracking.py +++ b/moviepy/video/tools/tracking.py @@ -100,14 +100,11 @@ def manual_tracking(clip, t1=None, t2=None, fps=None, n_objects=1, savefile=None txy_list = [] def gatherClicks(t): - imdisplay(clip.get_frame(t), screen) objects_to_click = n_objects clicks = [] while objects_to_click: - for event in pg.event.get(): - if event.type == pg.KEYDOWN: if event.key == pg.K_BACKSLASH: return "return" @@ -122,7 +119,6 @@ def gatherClicks(t): return clicks while t < t2: - clicks = gatherClicks(t) if clicks == "return": txy_list.pop() diff --git a/tests/test_VideoFileClip.py b/tests/test_VideoFileClip.py index 3fca0ec65..e92f78e04 100644 --- a/tests/test_VideoFileClip.py +++ b/tests/test_VideoFileClip.py @@ -37,7 +37,7 @@ def test_ffmpeg_resizing(): for target_resolution in target_resolutions: video = VideoFileClip(video_file, target_resolution=target_resolution) frame = video.get_frame(0) - for (target, observed) in zip(target_resolution[::-1], frame.shape): + for target, observed in zip(target_resolution[::-1], frame.shape): if target is not None: assert target == observed video.close() diff --git a/tests/test_ffmpeg_reader.py b/tests/test_ffmpeg_reader.py index e566bc558..f01127b73 100644 --- a/tests/test_ffmpeg_reader.py +++ b/tests/test_ffmpeg_reader.py @@ -727,7 +727,6 @@ def test_failure_to_release_file(util): # Repeat this so we can see that the problems escalate: for i in range(5): - # Create a random video file. red = ColorClip((256, 200), color=(255, 0, 0)) green = ColorClip((256, 200), color=(0, 255, 0)) diff --git a/tests/test_ffmpeg_writer.py b/tests/test_ffmpeg_writer.py index 23025a2c6..89ee48e99 100644 --- a/tests/test_ffmpeg_writer.py +++ b/tests/test_ffmpeg_writer.py @@ -238,7 +238,6 @@ def test_write_gif(util, clip_class, opt, loop, with_mask, pixel_format): ) if pixel_format != "invalid": - final_clip = VideoFileClip(filename) r, g, b = final_clip.get_frame(0)[0][0] diff --git a/tests/test_fx.py b/tests/test_fx.py index 23a646d94..0f4990302 100644 --- a/tests/test_fx.py +++ b/tests/test_fx.py @@ -1486,7 +1486,6 @@ def test_audio_delay(stereo_wave, duration, offset, n_repeats, decay): decayments = np.linspace(1, max(0, decay), n_repeats) for i in range(n_repeats + 1): # first clip, is not part of the repeated ones - if i == n_repeats: # the delay ends in sound, so last muted chunk does not exists break diff --git a/tests/test_issues.py b/tests/test_issues.py index 1abcedc6e..449dc418e 100644 --- a/tests/test_issues.py +++ b/tests/test_issues.py @@ -245,7 +245,6 @@ def size(t): def test_issue_354(): with ImageClip("media/python_logo.png") as clip: - clip.duration = 10 crosstime = 1 diff --git a/tests/test_videotools.py b/tests/test_videotools.py index 8d126dbb6..94ba0a7f2 100644 --- a/tests/test_videotools.py +++ b/tests/test_videotools.py @@ -654,7 +654,6 @@ def test_color_gradient( assert np.array_equal(result, expected_result) if shape == "radial": - circle_result = circle( size, p1,