Categories: Python

Создание видео из картинок с музыкой на python автоматически

Наткнулся на днях на очень интересный запрос. Человеку нужно было сделать много видео-обзоров для его интернет-магазина, чтобы разместить видео на youtube. То есть заказчик хотел обзоры своих товаров, и (скорее всего) по ключевым словам разместить их на ютубе. В заказе прямо писал что достаточно сделать скриншоты страниц, полазить по сайту и наложить легкую бесплатную музыку. И что работа однотипная, естественно платить много не сможет.
И я стал думать как же это автоматизировать: чтобы комп сам делал скриншоты, генерировал видео и накладывал аудио. Оказалось, не так и тяжело. Читайте, как все это замутить скриптом на python 3.

Как создать генератор видео с музыкой — план действий

Разобьем задачу на несколько мелких:
1) делаем скриншоты страниц сайта (с помощью selenium+phantomjs);
2) генерируем видео из картинок (с модулем OpenCV);
3) добавляем аудио на видео (через модуль moviepy).

Как сделать скриншоты сайта в питоне

Чтобы создать скриншот сайта в selenium достаточно прописать вот такой код:

browser.save_screenshot(r'D://screeshot1.png')

В нашей задаче удобнее всего использовать phantomjs (чтобы не открывать кучу окон Chrome или FireFox). Поэтому задаем в селениуме фантом, ставим размер окна и делаем скриншоты.

from selenium import webbrowser #импорт модуля
browser = webbrowser.PhantomJS() #задействуем phantomJS как браузер
browser.set_window_size(1024, 768) # задаем размеры окна
browser.get('https://bdseo.ru')#грузим сайт
browser.save_screenshot('C://bdseoru.png') #делаем скриншот

Несколько важных моментов:
1) selenium, phantomjs не входят в стандартную сборку (устанавливаем через pip, phantomjs скачиваем с основного сайта);
2) иногда нужно указать прямой путь к файлу phantomjs.exe (просто в скобках):

browser = webbrowser.PhantomJS('С:\\browser\\phantomjs.exe') #задействуем phantomJS как браузер

3) иногда не срабатывает set_window_size, и делается снимок всей высоты страницы. Если у вас так — пишите в комментарии;
4) при медленном соединении или долгой загрузкой сайта добавьте временную задержку, чтобы получить «нормальный» скриншот:

browser.get('https://bdseo.ru')#грузим сайт
time.sleep(2) #делаем паузу на 2 секунды, чтобы сайт прогрузился
browser.save_screenshot('C://bdseoru.png') #делаем скриншот
Генерируем видео с картинок на opencv python

Как создать видео с картинок на питоне

Идем дальше. Скриншоты страницы мы сделали, теперь будем генерировать видео:

# -*- coding: utf-8 -*- #задаем кодировку скрипта
import cv2, os #подключаем нужные модули

out = cv2.VideoWriter("C://video.avi", cv2.VideoWriter_fourcc('M','J','P','G'), 1.0, (768, 1024)) #создаем видео
out.write(cv2.imread('C://bdseoru1.png'))#добавляем картинки
out.write(cv2.imread('C://bdseoru2.png'))
out.write(cv2.imread('C://bdseoru3.png'))
out.write(cv2.imread('C://bdseoru4.png'))
out.release() #генерируем
cv2.destroyAllWindows() #завершаем

P.S. я не претендую на звание «кодер года», поэтому может что не так назвал или «неправильно» написал. Главное — что все работает.

Немного объясню строку:

out = cv2.VideoWriter("C://video.avi", cv2.VideoWriter_fourcc('M','J','P','G'), 1.0, (768, 1024)) #создаем видео

В скобках сначала прописываем КУДА мы записываем видео (оно может не существовать);
далее задаем кодеки (чуть позже напомню об этом);
потом частота кадров (в нашем случае 1.0 — 1 скриншот в секунду);
и в конце высота и ширина видео.
ВАЖНО! Когда генерируете видео, его размер должен быть такой же как и размер картинок. Если у Вас картинки разного размера — Вы получите ошибку.

Теперь по кодекам. Я более двух часов возился с ffmpeg, чтобы прописывать *’XVID’ в настройке, как было указано в документациях. В детали внедряться не буду, просто этот код работает как мне надо :).

Кроме того, в примере я импортирую библиотеку os. В некоторых случаях я использую следующий код для открытия файлов в cv2, кому как удобно:

out.write(cv2.imread(os.path.join(image_folder, 'bdseoru.png'))) #можно и так
out.write(cv2.imread(image_folder + 'bdseoru1.png'))# можно и так

После генерации видео идем дальше.

Добавляем аудио к видео файла с помощью moviepy на python 3

Как добавить аудио в видео в python 3

Нам нужно добавить аудио-файл к видео. Для этого я решил использовать модуль moviepy (устанавливается через pip).

import moviepy.editor as mpe

my_clip = mpe.VideoFileClip(r'C://video.avi') #наш видео-файл со скриншотами
my_clip.write_videofile(r'C:/result_video.mp4', audio='D:/Downloads/1.mp3')

Добавить дополнительную дорожку на видео в python 3 moviepy

Если Вам нужно добавить дополнительную дорожку на видео, то следует использовать код:

import moviepy.editor as mpe

my_clip = mpe.VideoFileClip(r'C:/video.avi')
audio_background = mpe.AudioFileClip(
    r'D:/Downloads/1.mp3')

final_audio = mpe.CompositeAudioClip([audio_background, my_clip.audio]) #maybe begin - this together audio
final_clip = my_clip.set_audio(final_audio)
final_clip.write_videofile(r'D:/result.mp4')

В таком случае сначала накладывается музыкальный файл, и если он короче длины видео — то оставшееся время идет основная дорожка с видео.

Заменить аудио на видео в python 3 moviepy

Если же нужно полностью заменить дорожку в видео, то используем пример:

import moviepy.editor as mpe

my_clip = mpe.VideoFileClip(r'C://video.avi') #наш видео-файл со скриншотами
my_clip.write_videofile(r'C:/result_video.mp4', audio='D:/Downloads/1.mp3')

Здесь основная дорожка с видео «убирается», пишется только наша музыка — 1.mp3. Если музыкальный файл короче видео, то дальше будет тишина.

Вывод

Вот так можно генерировать целые видео-обзоры со скриншотами, накладывать музыку, и все это делать массово. Теперь Вы знаете как сделать много видео без видео-редактора. Удобно, согласитесь. Я вот уже думаю заказов набрать, сразу после отпуска.
Полный код не привожу, еще в порядок не навел.
А Вы встречали подобные запросы? Или что-то другое связанное с видео, музыкой, скриншотами?

veniamin

View Comments

  • Доброго времени суток!

    Скажите как добавлять рандомно музыку из списка в видео?

    • Можно с помощью random.

      import random

      music_list = ['a', 'b', 'c', 'd', 'e']
      music4video = random.choice(music_list)

  • Кто подскажет как наложить аудио не с нулевой секунды,а с той секунды с которой мне нужно.

    • Посмотрите репозиторий moviepy на гитхаб. Там есть решения, как пример:

      clip.set_audio(CompositeAudioClip([audioclip.set_start(3)]))

  • Интересно. А как добавлять анимацию и текст на видео как во всех онлайн-редакторах делают?

    • Элементарно. Анимацию через VideoFileClip, картинки через ImageClip, текст через TextClip.
      Вчера делал генератор видео для ютуб, накладывал анимацию (стрелочки для "Переходите по ссылке").

Recent Posts

Как заработать токен NOT за стейкинг BNB или FDUSD

Очень много разговоров в последнее время за токен NOT. Много бирж будут делать листинг токена,…

6 месяцев ago

Как заработать TON и NOT за стейкинг в телеграм

Телеграм недавно запустил возможность стейкать (замораживать) USDT и получать за это их валюту TON. Очень…

6 месяцев ago

Бонус 100 USDT +10 BUSD от Binance

Биржа криптовалют Binance проводит сейчас промо-акцию: новым пользователям дают ваучеры в сумме 110 долларов. Деньги…

3 года ago

Как парсить длительность видео youtube на php в привычном виде

Самый главный момент в работе с youtube - это получить ключ api через консоль разработчика…

3 года ago

Как удалить чужую сессию пользователя в ubuntu (linux)

Арендую сервер для небольшого проекта на python. И вот приходит мне уведомление, что за сутки…

3 года ago

Как наложить watermark на видео в python windows массово

Тестирую одну схему, и нужно на много видео наложить watermark. Решил делать через Python 3,…

3 года ago