Введение
В данной статье напишем 5 программ на Python для работы с видео с использованием библиотеки moviepy.
Установка moviepy
Перед написанием кода необходимо установить библиотеку moviepy. Сделать это можно через pip. Для этого нужно перейти в терминал/командную строку, прописать pip install moviepy, нажать Enter и ждать установки.
pip install moviepy
Обрезка видео по времени на Python
Напишем код на Python для обрезки видео по времени. Импортируем всё необходимое из moviepy:
from moviepy.editor import VideoFileClip
Загрузим видео:
from moviepy.editor import VideoFileClip
# Загрузка видео
clip = VideoFileClip("input_video.mp4")
Обрежем видео с 10-й по 20-ю секунду и сохраним:
from moviepy.editor import VideoFileClip
clip = VideoFileClip("input_video.mp4")
# Обрезка видео с 10-й по 20-ю секунду
clip = clip.subclip(10, 20)
# Сохранение обрезанного видео
clip.write_videofile("trimmed_video.mp4")
В целом, это весь код для обрезки видео. Он обрезает видео с 10-й по 20-ю секунду и сохраняет результат в новый файл.
Создание слайд-шоу из изображений на Python
Напишем код на Python для создания слайд-шоу, который будет находить все изображения в указанной директории и формировать из них слайд-шоу. Первым делом импортируем всё необходимое из moviepy, а также модуль glob:
from moviepy.editor import ImageClip, concatenate_videoclips
import glob
Создадим функцию search_files(), которая будет находить все файлы определённого расширения в указанной директории.
У функции будет присутствовать два параметра, а именно:
- directory — путь до директории, из которой необходимо взять изображения для создания слайд-шоу.
- types — расширения искомых файлов (в нашем случае изображений).
from moviepy.editor import ImageClip, concatenate_videoclips
import glob
# Определение функции для поиска файлов в указанной директории с указанными типами файлов
def search_files(directory, types):
files_grabbed = []
for files in types:
files_grabbed.extend(glob.glob(f'{directory}/{files}'))
return files_grabbed
Теперь вызовем функцию search_files() с указанием директории и расширений:
from moviepy.editor import ImageClip, concatenate_videoclips
import glob
def search_files(directory, types):
files_grabbed = []
for files in types:
files_grabbed.extend(glob.glob(f'{directory}/{files}'))
return files_grabbed
# Вызов функции search_files() для поиска файлов с расширениями '*.png', '*.jpg' и *.jpeg в директории 'images'
image_files = search_files('images', ('*.png', '*.jpg', '*.jpeg'))
Создадим пустой список для сохранения видео-клипов из изображений:
from moviepy.editor import ImageClip, concatenate_videoclips
import glob
def search_files(directory, types):
files_grabbed = []
for files in types:
files_grabbed.extend(glob.glob(f'{directory}/{files}'))
return files_grabbed
image_files = search_files('images', ('*.png', '*.jpg', '*.jpeg'))
# Пустой список для сохранения видео-клипов
video_clips = []
Теперь пройдемся по каждому изображению с помощью цикла for. Внутри цикла каждое изображение будет сначала загружаться, затем изменяться его размер на 1024×1024, создаваться видеоклип продолжительностью 5 секунд с этим изображением, и клип будет добавляться в список video_clips:
from moviepy.editor import ImageClip, concatenate_videoclips
import glob
def search_files(directory, types):
files_grabbed = []
for files in types:
files_grabbed.extend(glob.glob(f'{directory}/{files}'))
return files_grabbed
image_files = search_files('images', ('*.png', '*.jpg', '*.jpeg'))
video_clips = []
# Проходимся по каждому изображению
for image_file in image_files:
# Загружаем изображение
image = ImageClip(image_file)
# Изменяем размер изображения
resized_image = image.resize((1024, 1024))
# Создаём видео-клип с изображением и заданной длительностью
video_clip = image.set_duration(5)
# Добавляем видео-клип в список
video_clips.append(video_clip)
Осталось объединить все полученные видео-клипы в одно слайд-шоу и сохранить:
from moviepy.editor import ImageClip, concatenate_videoclips
import glob
def search_files(directory, types):
files_grabbed = []
for files in types:
files_grabbed.extend(glob.glob(f'{directory}/{files}'))
return files_grabbed
image_files = search_files('images', ('*.png', '*.jpg', '*.jpeg'))
video_clips = []
for image_file in image_files:
image = ImageClip(image_file)
resized_image = image.resize((1024, 1024))
video_clip = image.set_duration(5)
video_clips.append(video_clip)
# Объединяем все видео-клипы в слайд-шоу
slideshow = concatenate_videoclips(video_clips)
# Сохраняем слайд-шоу в видео-файл
slideshow.write_videofile("Слайд-шоу.mp4", fps=24)
Итог
Разделение экранов видео на Python
Напишем интересный код на Python для разделения экранов видео. Для начала импортируем всё необходимое из moviepy:
from moviepy.editor import VideoFileClip, clips_array
Загрузим четыре видео:
from moviepy.editor import VideoFileClip, clips_array
# Загружаем первый видеоклип из файла "v1.mp4",
# берём его подотрезок с 0 по 2 секунды и добавляем границу в 5 пикселей
clip1 = VideoFileClip("v1.mp4").subclip(0, 2).margin(5)
# Загружаем второй видеоклип из файла "v2.mp4",
# берём его подотрезок с 0 по 2 секунды и добавляем границу в 5 пикселей
clip2 = VideoFileClip("v2.mp4").subclip(0, 2).margin(5)
# Загружаем третий видеоклип из файла "v3.mp4",
# берём его подотрезок с 0 по 2 секунды и добавляем границу в 5 пикселей
clip3 = VideoFileClip("v3.mp4").subclip(0, 2).margin(5)
# Загружаем четвертый видеоклип из файла "v4.mp4",
# берём его подотрезок с 0 по 2 секунды и добавляем границу в 5 пикселей
clip4 = VideoFileClip("v4.mp4").subclip(0, 2).margin(5)
Объединим все четыре видео в массив 2×2 и сохраняем:
from moviepy.editor import VideoFileClip, clips_array
clip1 = VideoFileClip("v1.mp4").subclip(0, 2).margin(5)
clip2 = VideoFileClip("v2.mp4").subclip(0, 2).margin(5)
clip3 = VideoFileClip("v3.mp4").subclip(0, 2).margin(5)
clip4 = VideoFileClip("v4.mp4").subclip(0, 2).margin(5)
# Объединяем видеоклипы в массив 2x2 (две строки и два столбца)
combined = clips_array([[clip1, clip2],
[clip3, clip4]])
# Записываем объединенное видео в файл "output.mp4"
combined.write_videofile('output.mp4')
Итог
Извлечение аудио из видео на Python
Напишем код для извлечения аудио из видео с сохранением в отдельный файл. Импортируем всё необходимое из moviepy:
from moviepy.editor import VideoFileClip
Загрузим видео:
from moviepy.editor import VideoFileClip
# Загрузка видео
clip = VideoFileClip("video2.mp4")
Извлечём аудио из видео и сохраним:
from moviepy.editor import VideoFileClip
clip = VideoFileClip("video2.mp4")
# Извлечение аудио из видео
audio = clip.audio
# Сохранение аудио в файл
audio.write_audiofile("audio_from_video.mp3")
Преобразование видео в GIF на Python
Последний код, который мы напишем, будет преобразовывать видео в формат GIF. Из moviepy импортируем класс VideoFileClip:
from moviepy.editor import VideoFileClip
Создадим функцию convert_video_to_gif(), которая и будет преобразовывать видео в GIF.
У функции будет присутствовать два параметра, а именно:
- video_path— путь к исходному видео.
- gif_path — путь/название к итоговому GIF.
from moviepy.editor import VideoFileClip
def convert_video_to_gif(video_path, gif_path):
# Загрузка видео
video = VideoFileClip(video_path)
# Запись файла GIF из объекта VideoFileClip
video.write_gif(gif_path, fps=60)
Вызовем функцию и передадим в неё пути:
from moviepy.editor import VideoFileClip
def convert_video_to_gif(video_path, gif_path):
video = VideoFileClip(video_path)
video.write_gif(gif_path, fps=60)
# Вызов функции convert_video_to_gif с путями к входному и выходному файлам
convert_video_to_gif("video.mp4", "output.gif")
Заключение
В ходе статьи мы с Вами написали код целых 5 программ на Python для работы с видео. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂
Мой Telegram канал
Мой YouTube канал
Мой курс по Python (50 видоуроков + дополнительные уроки)
Курс по созданию телеграм-ботов на Python с фреймворком Aiogram