Наткнулся на днях на очень интересный запрос. Человеку нужно было сделать много видео-обзоров для его интернет-магазина, чтобы разместить видео на 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') #делаем скриншот
Идем дальше. Скриншоты страницы мы сделали, теперь будем генерировать видео:
# -*- 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 (устанавливается через 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')
Если Вам нужно добавить дополнительную дорожку на видео, то следует использовать код:
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')
В таком случае сначала накладывается музыкальный файл, и если он короче длины видео — то оставшееся время идет основная дорожка с видео.
Если же нужно полностью заменить дорожку в видео, то используем пример:
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. Если музыкальный файл короче видео, то дальше будет тишина.
Вот так можно генерировать целые видео-обзоры со скриншотами, накладывать музыку, и все это делать массово. Теперь Вы знаете как сделать много видео без видео-редактора. Удобно, согласитесь. Я вот уже думаю заказов набрать, сразу после отпуска.
Полный код не привожу, еще в порядок не навел.
А Вы встречали подобные запросы? Или что-то другое связанное с видео, музыкой, скриншотами?
Очень много разговоров в последнее время за токен NOT. Много бирж будут делать листинг токена,…
Телеграм недавно запустил возможность стейкать (замораживать) USDT и получать за это их валюту TON. Очень…
Биржа криптовалют Binance проводит сейчас промо-акцию: новым пользователям дают ваучеры в сумме 110 долларов. Деньги…
Самый главный момент в работе с youtube - это получить ключ api через консоль разработчика…
Арендую сервер для небольшого проекта на python. И вот приходит мне уведомление, что за сутки…
Тестирую одну схему, и нужно на много видео наложить watermark. Решил делать через Python 3,…
View Comments
Доброго времени суток!
Скажите как добавлять рандомно музыку из списка в видео?
Можно с помощью random.
import random
music_list = ['a', 'b', 'c', 'd', 'e']
music4video = random.choice(music_list)
Кто подскажет как наложить аудио не с нулевой секунды,а с той секунды с которой мне нужно.
Посмотрите репозиторий moviepy на гитхаб. Там есть решения, как пример:
Интересно. А как добавлять анимацию и текст на видео как во всех онлайн-редакторах делают?
Элементарно. Анимацию через VideoFileClip, картинки через ImageClip, текст через TextClip.
Вчера делал генератор видео для ютуб, накладывал анимацию (стрелочки для "Переходите по ссылке").