Наткнулся на днях на очень интересный запрос. Человеку нужно было сделать много видео-обзоров для его интернет-магазина, чтобы разместить видео на youtube. То есть заказчик хотел обзоры своих товаров, и (скорее всего) по ключевым словам разместить их на ютубе. В заказе прямо писал что достаточно сделать скриншоты страниц, полазить по сайту и наложить легкую бесплатную музыку. И что работа однотипная, естественно платить много не сможет.
И я стал думать как же это автоматизировать: чтобы комп сам делал скриншоты, генерировал видео и накладывал аудио. Оказалось, не так и тяжело. Читайте, как все это замутить скриптом на python 3.
Как создать генератор видео с музыкой — план действий
Разобьем задачу на несколько мелких:
1) делаем скриншоты страниц сайта (с помощью selenium+phantomjs);
2) генерируем видео из картинок (с модулем OpenCV);
3) добавляем аудио на видео (через модуль moviepy).
Как сделать скриншоты сайта в питоне
Чтобы создать скриншот сайта в selenium достаточно прописать вот такой код:
1 | browser.save_screenshot(r'D://screeshot1.png') |
В нашей задаче удобнее всего использовать phantomjs (чтобы не открывать кучу окон Chrome или FireFox). Поэтому задаем в селениуме фантом, ставим размер окна и делаем скриншоты.
1 2 3 4 5 | 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 (просто в скобках):
1 | browser = webbrowser.PhantomJS('С:\\browser\\phantomjs.exe') #задействуем phantomJS как браузер |
3) иногда не срабатывает set_window_size, и делается снимок всей высоты страницы. Если у вас так — пишите в комментарии;
4) при медленном соединении или долгой загрузкой сайта добавьте временную задержку, чтобы получить «нормальный» скриншот:
1 2 3 | browser.get('https://bdseo.ru')#грузим сайт time.sleep(2) #делаем паузу на 2 секунды, чтобы сайт прогрузился browser.save_screenshot('C://bdseoru.png') #делаем скриншот |
Как создать видео с картинок на питоне
Идем дальше. Скриншоты страницы мы сделали, теперь будем генерировать видео:
1 2 3 4 5 6 7 8 9 10 | # -*- 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. я не претендую на звание «кодер года», поэтому может что не так назвал или «неправильно» написал. Главное — что все работает.
Немного объясню строку:
1 | out = cv2.VideoWriter("C://video.avi", cv2.VideoWriter_fourcc('M','J','P','G'), 1.0, (768, 1024)) #создаем видео |
В скобках сначала прописываем КУДА мы записываем видео (оно может не существовать);
далее задаем кодеки (чуть позже напомню об этом);
потом частота кадров (в нашем случае 1.0 — 1 скриншот в секунду);
и в конце высота и ширина видео.
ВАЖНО! Когда генерируете видео, его размер должен быть такой же как и размер картинок. Если у Вас картинки разного размера — Вы получите ошибку.
Теперь по кодекам. Я более двух часов возился с ffmpeg, чтобы прописывать *’XVID’ в настройке, как было указано в документациях. В детали внедряться не буду, просто этот код работает как мне надо :).
Кроме того, в примере я импортирую библиотеку os. В некоторых случаях я использую следующий код для открытия файлов в cv2, кому как удобно:
1 2 | out.write(cv2.imread(os.path.join(image_folder, 'bdseoru.png'))) #можно и так out.write(cv2.imread(image_folder + 'bdseoru1.png'))# можно и так |
После генерации видео идем дальше.
Как добавить аудио в видео в python 3
Нам нужно добавить аудио-файл к видео. Для этого я решил использовать модуль moviepy (устанавливается через pip).
1 2 3 4 | 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
Если Вам нужно добавить дополнительную дорожку на видео, то следует использовать код:
1 2 3 4 5 6 7 8 9 | 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
Если же нужно полностью заменить дорожку в видео, то используем пример:
1 2 3 4 | 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. Если музыкальный файл короче видео, то дальше будет тишина.
Вывод
Вот так можно генерировать целые видео-обзоры со скриншотами, накладывать музыку, и все это делать массово. Теперь Вы знаете как сделать много видео без видео-редактора. Удобно, согласитесь. Я вот уже думаю заказов набрать, сразу после отпуска.
Полный код не привожу, еще в порядок не навел.
А Вы встречали подобные запросы? Или что-то другое связанное с видео, музыкой, скриншотами?
Доброго времени суток!
Скажите как добавлять рандомно музыку из списка в видео?
Можно с помощью random.
import random
music_list = ['a', 'b', 'c', 'd', 'e']
music4video = random.choice(music_list)
Кто подскажет как наложить аудио не с нулевой секунды,а с той секунды с которой мне нужно.
Посмотрите репозиторий moviepy на гитхаб. Там есть решения, как пример:
Интересно. А как добавлять анимацию и текст на видео как во всех онлайн-редакторах делают?
Элементарно. Анимацию через VideoFileClip, картинки через ImageClip, текст через TextClip.
Вчера делал генератор видео для ютуб, накладывал анимацию (стрелочки для «Переходите по ссылке»).