From f860f0770d7de08b62dac02fcd8e19b52b6f849e Mon Sep 17 00:00:00 2001 From: RaPoSpectre <rapospectre@gmail.com> Date: Sat, 15 Oct 2016 13:04:50 +0800 Subject: [PATCH 1/9] fix issue #334 fix resize video when time changed trigger a error --- moviepy/video/VideoClip.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/moviepy/video/VideoClip.py b/moviepy/video/VideoClip.py index bcc6bb2bb..470dd2b16 100644 --- a/moviepy/video/VideoClip.py +++ b/moviepy/video/VideoClip.py @@ -516,6 +516,24 @@ def fl_image(self, image_func, apply_to=[]): # C O M P O S I T I N G + def fill_array(self, pre_array, shape=(0, 0)): + pre_shape = pre_array.shape + dx = shape[0] - pre_shape[0] + dy = shape[1] - pre_shape[1] + post_array = pre_array + if dx < 0: + post_array = pre_array[:shape[0]] + elif dx > 0: + x_1 = [[[1, 1, 1]] * pre_shape[1]] * dx + post_array = np.vstack((pre_array, x_1)) + if dy < 0: + post_array = post_array[:, :shape[1]] + elif dy > 0: + x_1 = [[[1, 1, 1]] * dy] * post_array.shape[0] + post_array = np.hstack((post_array, x_1)) + return post_array + + def blit_on(self, picture, t): """ Returns the result of the blit of the clip's frame at time `t` @@ -535,6 +553,9 @@ def blit_on(self, picture, t): img = self.get_frame(ct) mask = (None if (self.mask is None) else self.mask.get_frame(ct)) + if mask is not None: + if (img.shape[0] != mask.shape[0]) or (img.shape[1] != mask.shape[1]): + img = self.fill_array(img, mask.shape) hi, wi = img.shape[:2] # SET POSITION From b035660b1e00636a39e533cb8b1eb372aaaabd0d Mon Sep 17 00:00:00 2001 From: Billy Earney <billy.earney@gmail.com> Date: Tue, 14 Mar 2017 14:31:12 -0500 Subject: [PATCH 2/9] add scipy for py2.7 on travis-ci --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index efeaef852..e7bd1590e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,7 @@ before_install: - mkdir media install: - if [[ $TRAVIS_PYTHON_VERSION == '3.4' || $TRAVIS_PYTHON_VERSION == '3.5' || $TRAVIS_PYTHON_VERSION == '3.6' ]]; then pip install matplotlib; pip install -U scikit-learn; pip install scipy; fi + - if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then pip install scipy; fi - pip install coveralls - pip install pytest-cov - python setup.py install From 26ab7dce425416ebff8ab2079c6399bd542e20f9 Mon Sep 17 00:00:00 2001 From: Billy Earney <billy.earney@gmail.com> Date: Wed, 15 Mar 2017 09:40:20 -0500 Subject: [PATCH 3/9] add tests for ffmeg_parse_infos --- moviepy/video/io/ffmpeg_writer.py | 3 +-- tests/download_media.py | 3 +++ tests/test_ffmpeg_reader.py | 24 ++++++++++++++++++++++++ tests/test_misc.py | 8 -------- 4 files changed, 28 insertions(+), 10 deletions(-) create mode 100644 tests/test_ffmpeg_reader.py diff --git a/moviepy/video/io/ffmpeg_writer.py b/moviepy/video/io/ffmpeg_writer.py index de843f693..03b47a5d3 100644 --- a/moviepy/video/io/ffmpeg_writer.py +++ b/moviepy/video/io/ffmpeg_writer.py @@ -135,8 +135,7 @@ def write_frame(self, img_array): else: self.proc.stdin.write(img_array.tostring()) except IOError as err: - #ffmpeg_error = self.proc.stderr.read() - _, ffmpeg_error = self.proc.communicate() + ffmpeg_error = self.proc.stderr.read() error = (str(err) + ("\n\nMoviePy error: FFMPEG encountered " "the following error while writing file %s:" "\n\n %s" % (self.filename, ffmpeg_error))) diff --git a/tests/download_media.py b/tests/download_media.py index 248d97441..81cbeb540 100644 --- a/tests/download_media.py +++ b/tests/download_media.py @@ -33,3 +33,6 @@ def download(): download_url("https://raw.githubusercontent.com/earney/moviepy_media/master/tests/subtitles/subtitles1.srt", "media/subtitles1.srt") + + download_url("https://github.com/earney/moviepy_media/raw/master/tests/images/pigs_in_a_polka.gif", + "media/pigs_in_a_polka.gif") diff --git a/tests/test_ffmpeg_reader.py b/tests/test_ffmpeg_reader.py new file mode 100644 index 000000000..1252701a7 --- /dev/null +++ b/tests/test_ffmpeg_reader.py @@ -0,0 +1,24 @@ +import pytest +from moviepy.editor import * + +from moviepy.video.io.ffmpeg_reader import ffmpeg_parse_infos + +import sys +sys.path.append("tests") +import download_media + +def test_download_media(capsys): + with capsys.disabled(): + download_media.download() + +def test_ffmpeg_parse_infos(): + d=ffmpeg_parse_infos("media/big_buck_bunny_432_433.webm") + assert d['duration'] == 1.0 + + d=ffmpeg_parse_infos("media/pigs_in_a_polka.gif") + assert d['video_size']= [314, 273] + assert d['duration']= 3.0 + + +if __name__ == '__main__': + pytest.main() diff --git a/tests/test_misc.py b/tests/test_misc.py index 7376166b1..abf19b908 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -49,14 +49,6 @@ def test_subtitles(): subtitles = SubtitlesClip(data, generator) assert subtitles.subtitles == data -def test_file_to_subtitles(): - from moviepy.video.tools.subtitles import file_to_subtitles - - data = [([0.0, 4.0], 'Red!'), ([5.0, 9.0], 'More Red!'), - ([10.0, 14.0], 'Green!'), ([15.0, 19.0], 'More Green!'), - ([20.0, 24.0], 'Blue'), ([25.0, 29.0], 'More Blue!')] - - assert data == file_to_subtitles("media/subtitles1.srt") if __name__ == '__main__': pytest.main() From 24f3f4710bc31b3a38b67a4ad6e7b1f5d1b7f811 Mon Sep 17 00:00:00 2001 From: Billy Earney <billy.earney@gmail.com> Date: Wed, 15 Mar 2017 09:43:57 -0500 Subject: [PATCH 4/9] put communicate back in --- moviepy/video/io/ffmpeg_writer.py | 2 +- tests/test_misc.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/moviepy/video/io/ffmpeg_writer.py b/moviepy/video/io/ffmpeg_writer.py index 03b47a5d3..54bcc8e99 100644 --- a/moviepy/video/io/ffmpeg_writer.py +++ b/moviepy/video/io/ffmpeg_writer.py @@ -135,7 +135,7 @@ def write_frame(self, img_array): else: self.proc.stdin.write(img_array.tostring()) except IOError as err: - ffmpeg_error = self.proc.stderr.read() + _, ffmpeg_error = self.proc.communicate() error = (str(err) + ("\n\nMoviePy error: FFMPEG encountered " "the following error while writing file %s:" "\n\n %s" % (self.filename, ffmpeg_error))) diff --git a/tests/test_misc.py b/tests/test_misc.py index abf19b908..4e989afda 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -49,6 +49,15 @@ def test_subtitles(): subtitles = SubtitlesClip(data, generator) assert subtitles.subtitles == data +def test_file_to_subtitles(): + from moviepy.video.tools.subtitles import file_to_subtitles + + data = [([0.0, 4.0], 'Red!'), ([5.0, 9.0], 'More Red!'), + ([10.0, 14.0], 'Green!'), ([15.0, 19.0], 'More Green!'), + ([20.0, 24.0], 'Blue'), ([25.0, 29.0], 'More Blue!')] + + assert data == file_to_subtitles("media/subtitles1.srt") + if __name__ == '__main__': pytest.main() From 4f9709d145c004c6c241464473445ebcd798645e Mon Sep 17 00:00:00 2001 From: Billy Earney <billy.earney@gmail.com> Date: Wed, 15 Mar 2017 10:04:02 -0500 Subject: [PATCH 5/9] fix syntax error --- tests/test_ffmpeg_reader.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_ffmpeg_reader.py b/tests/test_ffmpeg_reader.py index 1252701a7..d7ac41d5f 100644 --- a/tests/test_ffmpeg_reader.py +++ b/tests/test_ffmpeg_reader.py @@ -16,8 +16,8 @@ def test_ffmpeg_parse_infos(): assert d['duration'] == 1.0 d=ffmpeg_parse_infos("media/pigs_in_a_polka.gif") - assert d['video_size']= [314, 273] - assert d['duration']= 3.0 + assert d['video_size'] == [314, 273] + assert d['duration'] == 3.0 if __name__ == '__main__': From 2e9f4600b3ab8848d5e64db78eb3a440cdf096bf Mon Sep 17 00:00:00 2001 From: Billy Earney <billy.earney@gmail.com> Date: Wed, 15 Mar 2017 10:11:28 -0500 Subject: [PATCH 6/9] Update test_misc.py --- tests/test_misc.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_misc.py b/tests/test_misc.py index 4e989afda..7376166b1 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -58,6 +58,5 @@ def test_file_to_subtitles(): assert data == file_to_subtitles("media/subtitles1.srt") - if __name__ == '__main__': pytest.main() From 6e93d02eccf712c46634c52edad273807b4f3070 Mon Sep 17 00:00:00 2001 From: Billy Earney <billy.earney@gmail.com> Date: Fri, 7 Apr 2017 08:46:51 -0500 Subject: [PATCH 7/9] add scroll test --- tests/download_media.py | 3 +++ tests/test_issues.py | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/tests/download_media.py b/tests/download_media.py index fa7f5222a..7b714a223 100644 --- a/tests/download_media.py +++ b/tests/download_media.py @@ -45,3 +45,6 @@ def download(): download_url("https://raw.githubusercontent.com/earney/moviepy_media/master/tests/misc/traj.txt", "media/traj.txt") + + download_url("https://github.com/earney/moviepy_media/raw/master/tests/images/vacation_2017.jpg", + "media/vacation_2017.jpg") diff --git a/tests/test_issues.py b/tests/test_issues.py index c6237e7e0..305fa66c0 100644 --- a/tests/test_issues.py +++ b/tests/test_issues.py @@ -153,5 +153,12 @@ def test_audio_reader(): subclip.write_audiofile(os.path.join(TMP_DIR, 'issue_246.wav'), write_logfile=True) +def test_issue_527(): + clip = ImageClip("media/vacation_2017.jpg") + new_clip = vfx.scroll(clip, w=1000, x_speed=50) + new_clip = new_clip.set_duration(20) + new_clip.fps = 24 + new_clip.write_videofile(os.path.join(TMP_DIR, "pano.mp4")) + if __name__ == '__main__': pytest.main() From 090fa05bac7115af0846ac89fa2aff2798f5fe56 Mon Sep 17 00:00:00 2001 From: Billy Earney <billy.earney@gmail.com> Date: Tue, 11 Apr 2017 10:38:41 -0500 Subject: [PATCH 8/9] add test for issue 334; PR 336 --- tests/download_media.py | 3 +++ tests/test_issues.py | 60 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/tests/download_media.py b/tests/download_media.py index 7b714a223..7fc400e98 100644 --- a/tests/download_media.py +++ b/tests/download_media.py @@ -25,6 +25,9 @@ def download(): download_url("https://github.com/earney/moviepy_media/raw/master/tests/images/afterimage.png", "media/afterimage.png") + download_url("https://github.com/earney/moviepy_media/blob/master/tests/videos/big_buck_bunny_0_30.webm?raw=true", + "media/big_buck_bunny_0_30.webm") + download_url("https://github.com/earney/moviepy_media/raw/master/tests/videos/big_buck_bunny_432_433.webm", "media/big_buck_bunny_432_433.webm") diff --git a/tests/test_issues.py b/tests/test_issues.py index 305fa66c0..11e2409d4 100644 --- a/tests/test_issues.py +++ b/tests/test_issues.py @@ -29,6 +29,66 @@ def test_issue_285(): merged_clip = concatenate_videoclips([clip_1, clip_2, clip_3]) assert merged_clip.duration == 30 + +def test_issue_334(): + last_move = None + last_move1 = None + + lis = [(0.0, 113, 167, 47), (0.32, 138, 159, 47), (0.44, 152, 144, 47), (0.48, 193, 148, 47), (0.6, 193, 148, 47), (0.76, 205, 138, 55), (0.88, 204, 121, 63), (0.92, 190, 31, 127), (1.2, 183, 59, 127), (1.4, 137, 22, 127), (1.52, 137, 22, 127), (1.72, 129, 67, 127), (1.88, 123, 69, 127), (2.04, 131, 123, 63), (2.24, 130, 148, 63), (2.48, 130, 148, 63), (2.8, 138, 180, 63), (3.0, 138, 180, 63), (3.2, 146, 192, 63), (3.28, 105, 91, 151), (3.44, 105, 91, 151), (3.72, 11, 48, 151), (3.96, 5, 78, 151), (4.32, 4, 134, 1), (4.6, 149, 184, 48), (4.8, 145, 188, 48), (5.0, 154, 217, 48), (5.08, 163, 199, 48), (5.2, 163, 199, 48), (5.32, 164, 187, 48), (5.48, 163, 200, 48), (5.76, 163, 200, 48), (5.96, 173, 199, 48), (6.0, 133, 172, 48), (6.04, 128, 165, 48), (6.28, 128, 165, 48), (6.4, 129, 180, 48), (6.52, 133, 166, 48), (6.64, 133, 166, 48), (6.88, 144, 183, 48), (7.0, 153, 174, 48), (7.16, 153, 174, 48), (7.24, 153, 174, 48), (7.28, 253, 65, 104), (7.64, 253, 65, 104), (7.8, 279, 116, 80), (8.0, 290, 105, 80), (8.24, 288, 124, 80), (8.44, 243, 102, 80), (8.56, 243, 102, 80), (8.8, 202, 107, 80), (8.84, 164, 27, 104), (9.0, 164, 27, 104), (9.12, 121, 9, 104), (9.28, 77, 33, 104), (9.32, 52, 23, 104), (9.48, 52, 23, 104), (9.64, 33, 46, 104), (9.8, 93, 49, 104), (9.92, 93, 49, 104), (10.16, 173, 19, 104), (10.2, 226, 173, 48), (10.36, 226, 173, 48), (10.48, 211, 172, 48), (10.64, 208, 162, 48), (10.92, 220, 171, 48)] + + lis1 = [(0.0, 113, 167, 47), (0.32, 138, 159, 47), (0.44, 152, 144, 47), (0.48, 193, 148, 47), (0.6, 193, 148, 47), (0.76, 205, 138, 55), (0.88, 204, 121, 63), (0.92, 190, 31, 127), (1.2, 183, 59, 127), (1.4, 137, 22, 127), (1.52, 137, 22, 127), (1.72, 129, 67, 127), (1.88, 123, 69, 127), (2.04, 131, 123, 63), (2.24, 130, 148, 63), (2.48, 130, 148, 63), (2.8, 138, 180, 63), (3.0, 138, 180, 63), (3.2, 146, 192, 63), (3.28, 105, 91, 151), (3.44, 105, 91, 151), (3.72, 11, 48, 151), (3.96, 5, 78, 151), (4.32, 4, 134, 1), (4.6, 149, 184, 48), (4.8, 145, 188, 48), (5.0, 154, 217, 48), (5.08, 163, 199, 48), (5.2, 163, 199, 48), (5.32, 164, 187, 48), (5.48, 163, 200, 48), (5.76, 163, 200, 48), (5.96, 173, 199, 48), (6.0, 133, 172, 48), (6.04, 128, 165, 48), (6.28, 128, 165, 48), (6.4, 129, 180, 48), (6.52, 133, 166, 48), (6.64, 133, 166, 48), (6.88, 144, 183, 48), (7.0, 153, 174, 48), (7.16, 153, 174, 48), (7.24, 153, 174, 48), (7.28, 253, 65, 104), (7.64, 253, 65, 104), (7.8, 279, 116, 80), (8.0, 290, 105, 80), (8.24, 288, 124, 80), (8.44, 243, 102, 80), (8.56, 243, 102, 80), (8.8, 202, 107, 80), (8.84, 164, 27, 104), (9.0, 164, 27, 104), (9.12, 121, 9, 104), (9.28, 77, 33, 104), (9.32, 52, 23, 104), (9.48, 52, 23, 104), (9.64, 33, 46, 104), (9.8, 93, 49, 104), (9.92, 93, 49, 104), (10.16, 173, 19, 104), (10.2, 226, 173, 48), (10.36, 226, 173, 48), (10.48, 211, 172, 48), (10.64, 208, 162, 48), (10.92, 220, 171, 48)] + + + def posi(t): + global last_move + if len(lis) == 0: + return (last_move[1], last_move[2]) + if t >= lis[0][0]: + last_move = item = lis.pop(0) + return (item[1], item[2]) + else: + if len(lis) > 0: + dura = lis[0][0] - last_move[0] + now = t - last_move[0] + w = (lis[0][1] - last_move[1]) * (now / dura) + h = (lis[0][2] - last_move[2]) * (now / dura) + # print t, last_move[1] + w, last_move[2] + h + return (last_move[1] + w, last_move[2] + h) + return (last_move[1], last_move[2]) + + def size(t): + global last_move1 + if len(lis1) == 0: + return (last_move1[3], last_move1[3] * 1.33) + if t >= lis1[0][0]: + last_move1 = item = lis1.pop(0) + return (item[3], item[3] * 1.33) + else: + if len(lis) > 0: + dura = lis1[0][0] - last_move1[0] + now = t - last_move1[0] + s = (lis1[0][3] - last_move1[3]) * (now / dura) + nsw = last_move1[3] + s + nsh = nsw * 1.33 + # print t, nsw, nsh + return (nsw, nsh) + return (last_move1[3], last_move1[3] * 1.33) + + + avatar = VideoFileClip("media/big_buck_bunny_432_433.webm", has_mask=True) + avatar.audio=None + maskclip = ImageClip("media/afterimage.png", ismask=True, transparent=True) + avatar.set_mask(maskclip) #must set maskclip here.. + + avatar = concatenate([avatar]*11) + + tt = VideoFileClip("media/big_buck_bunny_0_30.webm").subclip(0,11) + #setting mask here does not work. + #final = CompositeVideoClip([tt, avatar.set_position(posi).set_mask(maskclip).resize(size)]) + final = CompositeVideoClip([tt, avatar.set_position(posi).resize(size)]) + final.duration = tt.duration + final.write_videofile(os.path.join(TMP_DIR, 'issue_334.mp4'), fps=24) + def test_issue_354(): clip = ImageClip("media/python_logo.png") From 092f3e77376f30bcc4ae044caf5b793402158073 Mon Sep 17 00:00:00 2001 From: Billy Earney <billy.earney@gmail.com> Date: Tue, 11 Apr 2017 10:42:04 -0500 Subject: [PATCH 9/9] remove issue 527 since another PR solves this --- tests/download_media.py | 3 --- tests/test_issues.py | 7 ------- 2 files changed, 10 deletions(-) diff --git a/tests/download_media.py b/tests/download_media.py index 7fc400e98..f8ea8ac66 100644 --- a/tests/download_media.py +++ b/tests/download_media.py @@ -48,6 +48,3 @@ def download(): download_url("https://raw.githubusercontent.com/earney/moviepy_media/master/tests/misc/traj.txt", "media/traj.txt") - - download_url("https://github.com/earney/moviepy_media/raw/master/tests/images/vacation_2017.jpg", - "media/vacation_2017.jpg") diff --git a/tests/test_issues.py b/tests/test_issues.py index 11e2409d4..a854d9c40 100644 --- a/tests/test_issues.py +++ b/tests/test_issues.py @@ -213,12 +213,5 @@ def test_audio_reader(): subclip.write_audiofile(os.path.join(TMP_DIR, 'issue_246.wav'), write_logfile=True) -def test_issue_527(): - clip = ImageClip("media/vacation_2017.jpg") - new_clip = vfx.scroll(clip, w=1000, x_speed=50) - new_clip = new_clip.set_duration(20) - new_clip.fps = 24 - new_clip.write_videofile(os.path.join(TMP_DIR, "pano.mp4")) - if __name__ == '__main__': pytest.main()