Наткнулся на днях на очень интересный запрос. Человеку нужно было сделать много видео-обзоров для его интернет-магазина, чтобы разместить видео на 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://normail.biz/')#грузим сайт
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://normail.biz/')#грузим сайт
time.sleep(2) #делаем паузу на 2 секунды, чтобы сайт прогрузился
browser.save_screenshot('C://bdseoru.png') #делаем скриншот

Как создать видео с картинок на питоне
Идем дальше. Скриншоты страницы мы сделали, теперь будем генерировать видео:
# -*- 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'))# можно и так
После генерации видео идем дальше.

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


Интересно. А как добавлять анимацию и текст на видео как во всех онлайн-редакторах делают?
Элементарно. Анимацию через VideoFileClip, картинки через ImageClip, текст через TextClip.
Вчера делал генератор видео для ютуб, накладывал анимацию (стрелочки для “Переходите по ссылке”).
Кто подскажет как наложить аудио не с нулевой секунды,а с той секунды с которой мне нужно.
Посмотрите репозиторий moviepy на гитхаб. Там есть решения, как пример:
Доброго времени суток!
Скажите как добавлять рандомно музыку из списка в видео?
Можно с помощью random.
import random
music_list = ['a', 'b', 'c', 'd', 'e']
music4video = random.choice(music_list)