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

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

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

2 года ago

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

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

2 года ago

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

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

2 года ago

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

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

3 года ago

Kwork.ru: опыт поиска исполнителя и поздравление

Пришла в голову одна интересная идея. Связанно с тиктоком. Решил поискать исполнителя, который будет монтировать…

3 года ago

Отзыв о Накрутке подписчиков instagram через Socpublic в автоматическом режиме

Решил проверить "автоматическую" накрутку подписчиков в инстаграмме через сервис активной рекламы Socpublic.com. Сразу скажу -…

3 года ago