Для быстрых
1. Устанавливаете пакет yt-dlp в своем линуксе или качаете его отсюда.
2. Открываете консоль и запускаете $yt-dlp <url страницы с видео>
Все.
Для остальных
Зачем?
Допустим вы ML инженер, которому требуется обучить свои нейросети на нецензурных фото и видео так, чтобы они делали что-нибудь полезное: Фильтровали NSFW контент или наоборот - создавали его. Ну или просто наконец-таки научились рисовать людей с ясными глазами и зачётным количеством пальцев на руках и ногах.
База данных
Трудно придумать более подходящий для этих целей источник информации о правильной анатомии людей, чем PornHUB. И не только потому, что это большая база видео, которые можно нарезать на картинки для обучения, но и, главное, потому что этот ресурс шарит с нами базу данных обо всех видео, загруженных туда от допотопных времен и до сего дня, включая названия, категорий, ключевые слова, имена актеров и фото ключевых моментов из видео. Т.е. в какой-то степени из одной только данной БД мы имеем уже аннотированные картинки, что само по себе бесценно для обучения нейросетей.
База данных дана в виде пожатого зипом csv файлика размером всего 1.4Gb (распакованный 16Gb)
Формат его примерно следующеий:
embed|thumbnail|thumbnail2|title|tags|categories|pornstars|duration|views|likes|dislikes|thumbnail3|thumbnail4
embed - ссылка на видео
thumbnail - набор url уменьшеных фото, разделенных ;
В общем сказочный подарок для инженера.
Задача
Но только вот, как всегда, этого может оказаться мало.
Картинки размера примерно 640x480 на них не видны мелкие детали, которые имеются в исходных видео. Кроме того, если нам требуется вырабатывать у моделей понимание физики процессов, то необходима последовательность изображений развернутая во времени, а для этого нужно получить кадры из видео не только с максимальным разрешением, но и необходимой частотой - хотя бы по одному в секунду.
Не помешает понять примерно как работают скачиватели видео типа yt-dlp.
Они проходят по ссылке с видео берут куки у сервера с ключом доступа к видео и качают его по частям фрагментами. Потом объединяют фрагменты в один файл и сохраняют его. Сделаем код, который поступает примерно так же.
Шаги:
- Извлечь базовый URL для сегментов.
- Скачать все сегменты видео.
- Объединить сегменты в один файл с помощью ffmpeg.
Пример кода:
import os
import requests
from tqdm import tqdm
# Базовый URL для сегментов
base_url = "https://ev-h.phncdn.com/hls/videos/202405/01/451830001/,1080P_4000K,720P_4000K,480P_2000K,240P_1000K,_451830001.mp4.urlset/"
# Параметры для запросов
params = "?validfrom=1718628127&validto=1718635327&hdl=-1&hash=Uwuh52Ddfrrn2jlV3Unfprs5e18%3D"
# Количество сегментов (пример)
num_segments = 100
# Папка для сохранения сегментов
os.makedirs('segments', exist_ok=True)
# Скачивание всех сегментов
for i in tqdm(range(1,num_segments)):
segment_url = f"{base_url}seg-{i}-f1-v1-a1.ts{params}"
response = requests.get(segment_url)
with open(f'segments/seg-{i}.ts', 'wb') as file:
file.write(response.content)
# Объединение всех сегментов в один файл с помощью ffmpeg
with open("file_list.txt", "w") as file_list:
for i in range(1,num_segments):
file_list.write(f"file 'segments/seg-{i}.ts'\n")
os.system('ffmpeg -f concat -safe 0 -i file_list.txt -c copy output.mp4')
Пояснения:
- В base_url подставляем id видео из вышеупомянутой базы данных
https://ev-h.phncdn.com/hls/videos/<дата и id>/,1080P_4000K,720P_4000K,480P_2000K,240P_1000K,_<id>.mp4.urlset/ - Скачивание сегментов:Скачиваем каждый сегмент по URL, используя requests.get().
Сохраняем сегменты в папку segments.
tqdm используется для отображения прогресса загрузки. - Объединение сегментов:Создаем файл file_list.txt, который содержит список всех сегментов в нужном порядке.
Используем ffmpeg для объединения сегментов в один видеофайл. Команда ffmpeg -f concat -safe 0 -i file_list.txt -c copy output.mp4 объединяет все сегменты, сохраняя их исходные параметры кодирования. - Как получить параметры validfrom, validto, hash - допишите сами, я пока беру из браузера. В dev консоли на закладке Network показывает, что, откуда и с какими параметрами качается.
И что дальше??
У нас есть файл с видео output.mp4 осталось побить его на кадры, чтобы кормить ими нейросеть.
Для извлечения кадров из видео-сегмента и сохранения их в формате JPG можно использовать тот же ffmpeg, что и при сборке видео из фрагментов. Этот мощный инструмент для обработки мультимедийных данных позволяет легко извлечь кадры из видео.
Пример команды ffmpeg для извлечения кадров
Если у вас есть видео-сегмент segment.ts или полное видео и вы хотите извлечь кадры в формате JPG/PNG, вот пример команды, которую можно использовать:
ffmpeg -i output.mp4 -vf "fps=1" frames/frame_%03d.png
Пояснения:
- -i output.mp4: указывает входной файл. Это может быть как отдельный сегмент так и полное видео.
- -vf "fps=1": фильтр видео, который извлекает 1 кадр в секунду (можно настроить для извлечения большего или меньшего количества кадров).
- frames/frame_%03d.png: указывает шаблон имен файлов для выходных кадров. %03d означает, что кадры будут пронумерованы с ведущими нулями (например, frame_001.png, frame_002.png и т.д.).
Всем добра!