Вращая цветной клип в MoviePy? - PullRequest
2 голосов
/ 31 марта 2020

Я пытаюсь повернуть цветной видеоклип без анимации, чтобы он вращался в начале и оставался повернутым до конца видео.

Я попробовал код, надеясь, что он будет поверните неподвижное изображение в MoviePy, не анимируя его. Так что он поворачивается на угол ввода для всей продолжительности изображения, ColorClip или Video.

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 градусов?

1 Ответ

1 голос
/ 07 апреля 2020

РЕДАКТИРОВАТЬ: Я нашел ошибку, и вы можете отслеживать прогресс исправления ошибки здесь: 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() возвращает новый клип , поэтому вы должны сделать image = image.rotate(20).

. Это должно работать как для ImageClips, так и для ColorClips, однако, похоже, вы обнаружили ошибку, при которой вращения не работают для ColorClips. Лучше всего сообщить об этом как о проблеме на github.com / zulko / moviepy , или попытаться найти исправление самостоятельно и отправить его в виде запроса на извлечение там.

В настоящее время создайте ColorClip, запишите его в файл и затем снова прочитайте его как ImageClip.

...