在 MoviePy 中旋转彩色剪辑?

Rotating a color clip in MoviePy?

我正在尝试旋转一个电影般的彩色剪辑而不对其进行动画处理,以便它在开始时旋转,并一直旋转到视频结束。

我尝试了一些代码,希望它能在 MoviePy 中旋转静止图像,而不对其进行动画处理。以便在图像、ColorClip 或视频的整个持续时间内按输入角度旋转。

import moviepy.editor as mped
image = mped.ImageClip("image.jpg", duration=3)
image.rotate(20)
image.write_videofile('image_without_rotation.mp4', fps=5)

但是,这不会旋转静止图像,因为 ImageClip 没有旋转功能。

下面这段代码循环到 3 秒。并且可以通过将 20*t 更改为像 20 这样的常量来适应固定旋转/非动画。

clip = mped.ImageClip('image.jpg')
rotated_clip = (clip.add_mask().fx(mped.vfx.rotate, lambda t: 20*t, expand=False).set_duration(3))
centered_rotated_clip = mped.CompositeVideoClip([rotated_clip.set_pos("center")])
centered_rotated_clip.write_videofile('rotated_image.mp4'), fps=10)

但是,此代码不适用于电影风格的 ColorClip。

color_clip = mped.ColorClip(size=[300, 300], color=[1 ,1, 1])
rotated_color_clip = (color_clip.fx(mped.vfx.rotate, lambda t: 20, expand=False).set_duration(3))
composited_clip = mped.CompositeVideoClip([rotated_Color_ clip.set_pos("center")])
composited_clip.write_videofile('rotated_clip.mp4', fps=10)

相反,它会给出以下错误

    raise TypeError("Cannot handle this data type: %s, %s" % typekey)
TypeError: Cannot handle this data type: (1, 1, 3), <i8

因为到了这条线

return np.array( Image.fromarray(pic).rotate(angle, expand=expand),

里面 pil_rotater.

如何将动画 ColorClip 旋转 20 度?

更新 2:此修复包含在 v2.0.0.dev1 中。使用 pip install --pre --upgrade moviepy.

从 pip 安装

更新:我发现了这个错误,你可以在这里跟踪错误修复的进度:https://github.com/Zulko/moviepy/pull/1139

同时,作为一种解决方法,不是将 color=[150, 100, 200] 传递给 ColorClip,而是传递 color=np.array([150, 100, 200]).astype(np.uint8).

————

密码

image = mped.ImageClip("image.jpg", duration=3)
image.rotate(20)
image.write_videofile('image_without_rotation.mp4', fps=5)

不工作因为image.rotate() returns一个新剪辑,所以你必须做image = image.rotate(20)

这应该适用于 ImageClips 和 ColorClips,但是您似乎发现了一个错误,其中旋转不适用于 ColorClips。最好的办法是在 github.com/zulko/moviepy 将其报告为问题,或者尝试自己找到修复程序并将其作为拉取请求提交到那里。

暂时创建一个ColorClip,将其写入文件,然后将其作为ImageClip再次读入。