JavaRush /Курси /Python SELF UA /Створення плавних переходів між сценами та ефектів зміни ...

Створення плавних переходів між сценами та ефектів зміни кадрів

Python SELF UA
Рівень 48 , Лекція 2
Відкрита

1. Відеопереходи

Сьогодні ми захоплюємо область, в якій дійсно проявляється магія відеомонтажу — створення плавних переходів. Це як навчитися танцювати танго: важливо не тільки робити кроки, але й робити їх із грацією і ритмом.

Уяви, що ти знімаєш епічне кіно про свого кота, який підкорює світ (або просто залазить на шафу). Ти хочеш, щоб глядачі плавно перенеслися від сцени, де він завзято стрибає по диванах, до моменту, коли він благородно позує на вершині книжкової шафи. Саме тут на арену виходять переходи, роблячи зміну сцен більш гармонійною і професійною.

Навіщо потрібні переходи?

  • Згладити різкість зміни кадрів.
  • Акцентувати увагу на важливих моментах.
  • Додати художні ефекти.

Основні принципи створення переходів

У MoviePy для створення переходів між сценами використовується клас CompositeVideoClip, а також вбудовані ефекти. Основна ідея — накласти один кліп на інший із використанням ефекту, який керує прозорістю, переміщенням або зсувом.

2. Перехід з плавним затуханням (Crossfade)

Плавне затухання (або crossfade) — це ефект, при якому перша сцена плавно зникає, а друга поступово з'являється. Цей тип переходу можна реалізувати за допомогою методів crossfadein() і crossfadeout().

Плавний перехід з затуханням між двома кліпами

Python
from moviepy.editor import VideoFileClip, concatenate_videoclips

# Завантаження двох відеокліпів
clip1 = VideoFileClip("scene1.mp4").subclip(0, 5)
clip2 = VideoFileClip("scene2.mp4").subclip(0, 5)

# Налаштування плавного затухання
clip1 = clip1.crossfadeout(1)  # Плавне затухання кліпу 1 на 1 секунду
clip2 = clip2.crossfadein(1)   # Плавна поява кліпу 2 на 1 секунду

# Об'єднання кліпів з переходом
final_clip = concatenate_videoclips([clip1, clip2], method="compose")
final_clip.write_videofile("crossfade_transition.mp4")

У цьому прикладі:

  • crossfadeout(1) робить перший кліп поступово менш прозорим протягом однієї секунди.
  • crossfadein(1) змушує другий кліп плавно з'являтися.
  • concatenate_videoclips об'єднує два кліпи з плавним затуханням.

3. Перехід з затемненням (Fade to Black)

Затемнення (або fade to black) — це ефект, при якому перший кліп поступово згасає до чорного екрану, а наступний кліп з'являється із затемнення. Цей тип переходу створює ефект завершення однієї сцени і початку іншої.

Приклад: Перехід із затемненням між кліпами

Python
# Завантаження двох кліпів
clip1 = VideoFileClip("scene1.mp4").subclip(0, 5)
clip2 = VideoFileClip("scene2.mp4").subclip(0, 5)

# Налаштування затемнення
clip1 = clip1.fadeout(1)  # Плавне затемнення кліпу 1
clip2 = clip2.fadein(1)   # Поява кліпу 2 з чорного екрану

# Об'єднання кліпів із затемненням
final_clip = concatenate_videoclips([clip1, clip2], method="compose")
final_clip.write_videofile("fade_to_black_transition.mp4")

Тут:

  • fadeout(1) створює поступове згасання першого кліпу.
  • fadein(1) змушує другий кліп з'являтися з чорного екрану.

4. Перехід зсуву (Slide Transition)

Перехід зсуву (або slide transition) дозволяє одному кліпу «з'їжджати» з екрану, а другому займати його місце. MoviePy дозволяє налаштувати рух кліпу, використовуючи метод set_position().

Приклад: Перехід зі зсувом між кліпами

Python
from moviepy.editor import CompositeVideoClip

# Два кліпи, які будуть переміщуватися
clip1 = VideoFileClip("scene1.mp4").subclip(0, 5)
clip2 = VideoFileClip("scene2.mp4").subclip(0, 5)

# Налаштування переходу зсуву
transition_duration = 1

# Установка руху кліпів
clip1 = clip1.set_position(lambda t: ('center', -clip1.h * t / transition_duration))
clip2 = clip2.set_position(lambda t: ('center', clip2.h * (1 - t / transition_duration)))

# Створення композиції
final_clip = CompositeVideoClip([clip1.set_start(0), clip2.set_start(clip1.duration - transition_duration)])
final_clip = final_clip.set_duration(clip1.duration + clip2.duration - transition_duration)

# Експорт відео з переходом зсуву
final_clip.write_videofile("slide_transition.mp4")

Тут:

  • set_position() задає анімацію, при якій один кліп зсувається вгору, а інший — вниз.

5. Перехід з розмиттям (Blur Transition)

Перехід з розмиттям використовується для плавного переходу між кліпами, де перший кліп поступово розмивається, а другий кліп «виходить» з розмитого стану. У MoviePy для цього використовується ефект розмиття blur.

Приклад: Перехід з розмиттям між кліпами

Python
from moviepy.video.fx.all import blur

# Застосування розмиття до першого кліпу
blurred_clip1 = clip1.fx(blur, 2)  # Застосування розмиття

# Налаштування плавного переходу з розмиттям
blurred_clip1 = blurred_clip1.crossfadeout(1)
clip2 = clip2.crossfadein(1)

# Об'єднання кліпів
final_clip = concatenate_videoclips([blurred_clip1, clip2], method="compose")
final_clip.write_videofile("blur_transition.mp4")

Тут:

  • blur(video, 2) створює розмиття на першому кліпі.
  • crossfadein() і crossfadeout() додають плавний перехід між кліпами.

6. Перехід з ефектом збільшення масштабу (Zoom Transition)

Перехід із збільшенням масштабу (або zoom transition) створює ефект наближення або віддалення кадру. Цей ефект корисний для створення цікавих переходів і виділення окремих сцен.

Перехід із збільшенням масштабу

Python
from moviepy.video.fx.all import resize

# Збільшення масштабу першого кліпу
zoomed_clip1 = clip1.resize(lambda t: 1 + 0.2 * t)  # Збільшення масштабу на 20% за секунду

# Налаштування плавного переходу
zoomed_clip1 = zoomed_clip1.crossfadeout(1)
clip2 = clip2.crossfadein(1)

# Об'єднання кліпів із збільшенням масштабу
final_clip = concatenate_videoclips([zoomed_clip1, clip2], method="compose")
final_clip.write_videofile("zoom_transition.mp4")

Тут:

  • resize(lambda t: 1 + 0.2 * t) збільшує масштаб першого кліпу на 20% кожну секунду, створюючи ефект наближення.

7. Перехід із вицвітанням (Fade to Color)

Перехід із вицвітанням — це ефект, при якому кліп плавно змінює колір, наприклад, вицвітає у білий, а потім з'являється наступний кліп. Цей ефект надає відео більш м'яку зміну сцен.

Перехід із вицвітанням у білий

Python
from moviepy.editor import ColorClip

# Створення білого фону для переходу
fade_color = ColorClip(size=clip1.size, color=(255, 255, 255), duration=1)

# Налаштування затухання першого кліпу
clip1 = clip1.crossfadeout(1)

# Поява другого кліпу
clip2 = clip2.crossfadein(1)

# Об'єднання кліпів через білий фон
final_clip = concatenate_videoclips([clip1, fade_color, clip2], method="compose")
final_clip.write_videofile("fade_to_white_transition.mp4")

Тут:

  • ColorClip(size=clip1.size, color=(255, 255, 255), duration=1) створює однотонний кліп, який служить проміжним елементом для переходу.
  • Спочатку кліп clip1 затухає до білого, потім з'являється другий кліп.

8. Перехід з використанням геометричної маски (Shape Transition)

Перехід з використанням геометричної маски — це ефект, коли перший кліп зникає в формі кола, квадрата або іншої геометричної фігури, а другий кліп з'являється з цієї ж форми. Цей ефект додає цікавий візуальний акцент.

MoviePy не підтримує такі маски напряму, але їх можна створити, накладаючи поступово змінювану форму, використовуючи бібліотеку Pillow (PIL) для створення анімації маски.

Перехід через кругову маску

Python
from moviepy.editor import VideoFileClip, CompositeVideoClip
from PIL import Image, ImageDraw
import numpy as np

def create_circle_mask(size, radius):
    # Створення чорно-білої маски з колом
    mask = Image.new("L", size, 0)
    draw = ImageDraw.Draw(mask)
    draw.ellipse((size[0]//2 - radius, size[1]//2 - radius,
                  size[0]//2 + radius, size[1]//2 + radius), fill=255)
    return np.array(mask)

# Завантаження кліпів
clip1 = VideoFileClip("scene1.mp4").subclip(0, 5)
clip2 = VideoFileClip("scene2.mp4").subclip(0, 5)

# Налаштування переходу через кругову маску
mask_clips = []
for r in range(0, max(clip1.size)//2, 10):
    mask = create_circle_mask(clip1.size, r)
    mask_clip = CompositeVideoClip([clip1.set_mask(mask)], size=clip1.size).set_duration(0.05)
    mask_clips.append(mask_clip)

# Створення фінального кліпа з переходом
transition_clip = concatenate_videoclips(mask_clips + [clip2])
transition_clip.write_videofile("circular_mask_transition.mp4")

Тут:

  • create_circle_mask() створює чорно-білу маску у формі кола з заданим радіусом.
  • Ми збільшуємо радіус кола по кадрах, щоб створити анімацію, де кліп зникає в коло.

9. Перехід через розмиття руху (Motion Blur)

Перехід через розмиття руху використовується, щоб надати кліпу ілюзію руху. Цей перехід створюється шляхом комбінування горизонтального або вертикального зсуву з ефектом розмиття.

Перехід через розмиття руху

Python
from moviepy.video.fx.all import blur

# Створення розмиття руху
blurred_clip1 = clip1.fx(blur, 1).set_position(lambda t: ('center', int(500 - 100 * t)))
blurred_clip2 = clip2.fx(blur, 1).set_position(lambda t: ('center', int(-500 + 100 * t)))

# Об'єднання кліпів з ефектом розмиття руху
transition_clip = CompositeVideoClip([blurred_clip1.set_start(0), blurred_clip2.set_start(blurred_clip1.duration - 1)])
transition_clip.write_videofile("motion_blur_transition.mp4")

У цьому прикладі:

  • Кліп зсувається вгору і розмивається, створюючи ілюзію руху.
  • blur(video, 1) розмиває кадри, що допомагає приховати різкий перехід між кліпами.

10. Перехід з обертанням (Spin Transition)

Обертання — це динамічний перехід, під час якого перший кліп починає обертатись, поступово зникаючи, а другий кліп з'являється з обертанням.

Приклад: Перехід з обертанням

Python
from moviepy.video.fx.all import rotate

# Обертання першого і другого кліпів
rotated_clip1 = clip1.rotate(lambda t: 30 * t)
rotated_clip2 = clip2.rotate(lambda t: -30 * t)

# Налаштування переходу
rotated_clip1 = rotated_clip1.crossfadeout(1)
rotated_clip2 = rotated_clip2.crossfadein(1)

# Об'єднання з переходом обертання
final_clip = concatenate_videoclips([rotated_clip1, rotated_clip2], method="compose")
final_clip.write_videofile("spin_transition.mp4")

Тут:

  • rotate(lambda t: 30 * t) додає поступове обертання до кліпу. Перший кліп обертається в одному напрямку, другий — у протилежному.

11. Перехід з піксельним ефектом (Pixelate Transition)

Перехід з піксельним ефектом — це ефект, за якого зображення поступово розбивається на пікселі, а потім плавно повертається до нормального стану. Цей перехід створює ефект цифрового спотворення.

Приклад: Перехід з піксельним ефектом

Python
from moviepy.video.fx.all import resize

# Пікселізація першого кліпу
pixelated_clip1 = clip1.resize(0.1).resize(10)

# Плавне затемнення
pixelated_clip1 = pixelated_clip1.crossfadeout(1)
clip2 = clip2.crossfadein(1)

# Об'єднання кліпів з піксельним ефектом
final_clip = concatenate_videoclips([pixelated_clip1, clip2], method="compose")
final_clip.write_videofile("pixelate_transition.mp4")

Тут:

  • resize(0.1).resize(10) зменшує і потім збільшує зображення, створюючи ефект пікселізації.

12. Проєктування власної сцени

Час практики! Додайте кілька своїх відеофайлів і експериментуйте з різними комбінаціями переходів. Як щодо використання музики або звукових ефектів для підсилення атмосферності переходу? Наприклад, у момент переходу додати невеликий звук "whoosh" для додаткового ефекту.

Створення унікальних переходів

Створення унікальних переходів — це як приготування страви за власним рецептом. Ви можете комбінувати різні техніки та ефекти, щоб створити щось абсолютно нове й унікальне. Спробуйте експериментувати з функціями slide_in, slide_out або навіть більш складними ефектами, такими як mask для створення унікальних візуальних змін.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ