ESC

Start typing to search across invoices, services, domains, tickets, and more...

Search... Ctrl+K
Сценарии использования и решения

Бэкенд платформы VOD и коротких видео: серверы хранения, HLS-транскодирование FFmpeg, MinIO и CDN

8 шагов 28 мин чтения 3 просмотров 0
Содержание

Бэкенду платформы видео по запросу (VOD) или коротких видео нужны четыре компонента: выделенные серверы хранения для исходников и рендишенов, конвейер транскодирования на ffmpeg с выводом HLS-лестниц битрейтов, S3-совместимое объектное хранилище вроде MinIO и CDN, который берёт на себя основную часть трафика. IMIDC предоставляет эту инфраструктуру в Гонконге (CN2 GIA в материковый Китай), Токио, Сингапуре, Лос-Анджелесе и других локациях Азии: выделенные серверы в Гонконге от $139/мес, в Лос-Анджелесе от $499/мес, аплинки 10 Гбит/с, защита от DDoS и CDN IMIDC.

Ключевые факты
  • Регионы: Гонконг для аудитории в Китае; Токио, Сингапур, Тайбэй, Сеул, Бангкок и Лос-Анджелес для региональных аудиторий.
  • Выделенные серверы: Гонконг от $139/мес, Тайвань от $199/мес, Лос-Анджелес от $499/мес.
  • Аплинки 10 Гбит/с, SSD, защита от DDoS и колокация от 1U до целой стойки для собственных систем хранения.
  • CDN IMIDC раздаёт HLS-сегменты, а серверы хранения работают как origin, а не как передовая линия.
  • Бесплатная миграция серверов при переносе существующей видеотеки.

Конвейер VOD от загрузки до воспроизведения

Любая видеоплатформа проходит один и тот же путь: загрузка, хранение исходника, транскодирование, хранение рендишенов, доставка через CDN.

  1. Загрузка: клиенты загружают файлы прямо в объектное хранилище по presigned URL, и API-серверы не проксируют большие файлы.
  2. Очередь: событие завершения загрузки ставит задачу в очередь (Redis, RabbitMQ или таблица в БД).
  3. Транскодирование: воркеры запускают ffmpeg и создают HLS-лестницу, обложку и короткое превью.
  4. Хранение: рендишены попадают в публичный на чтение HLS-бакет, исходники — в холодное хранилище.
  5. Доставка: плеер загружает master.m3u8 с CDN, а CDN забирает недостающие сегменты с origin хранения.

Метаданные (названия, владельцы, просмотры, статус модерации) храните в обычной БД на API-сервере, а сами байты — на серверах хранения.

Транскодирование ffmpeg: лестницы битрейтов HLS

Кодируйте каждое видео сразу в несколько разрешений с выровненными ключевыми кадрами, чтобы плеер плавно переключал качество.

mkdir -p out/v0 out/v1 out/v2 out/v3
ffmpeg -i input.mp4 \
  -filter_complex "[0:v]split=4[a][b][c][d];[a]scale=-2:1080[v0];[b]scale=-2:720[v1];[c]scale=-2:480[v2];[d]scale=-2:360[v3]" \
  -map "[v0]" -c:v:0 libx264 -b:v:0 5000k -maxrate:v:0 5350k -bufsize:v:0 7500k \
  -map "[v1]" -c:v:1 libx264 -b:v:1 2800k -maxrate:v:1 3000k -bufsize:v:1 4200k \
  -map "[v2]" -c:v:2 libx264 -b:v:2 1400k -maxrate:v:2 1500k -bufsize:v:2 2100k \
  -map "[v3]" -c:v:3 libx264 -b:v:3 800k  -maxrate:v:3 856k  -bufsize:v:3 1200k \
  -map a:0 -map a:0 -map a:0 -map a:0 -c:a aac -b:a 128k -ac 2 \
  -preset medium -profile:v high -pix_fmt yuv420p \
  -force_key_frames "expr:gte(t,n_forced*2)" -sc_threshold 0 \
  -f hls -hls_time 4 -hls_playlist_type vod -hls_flags independent_segments \
  -hls_segment_filename "out/v%v/seg_%04d.ts" \
  -master_pl_name master.m3u8 \
  -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2 v:3,a:3" \
  out/v%v/index.m3u8
РендишенРазрешение (16:9)Битрейт видеоАудиоТипичный зритель
1080p1920x10805 000 кбит/с128 кбит/с AACПК, ТВ, Wi-Fi
720p1280x7202 800 кбит/с128 кбит/с AACСмартфоны на хорошем 4G/5G
480p854x4801 400 кбит/с128 кбит/с AACПерегруженные мобильные сети
360p640x360800 кбит/с128 кбит/с AACСлабый сигнал, режим экономии трафика
  • -force_key_frames "expr:gte(t,n_forced*2)" ставит ключевой кадр каждые 2 секунды независимо от частоты кадров, а -sc_threshold 0 выравнивает их между рендишенами.
  • H.264 воспроизводится везде; позже добавьте лестницу HEVC или AV1, чтобы экономить трафик на поддерживающих устройствах.
  • Транскодирование на CPU масштабируется числом ядер: многоядерные выделенные серверы — самый простой пул воркеров. Одна задача ffmpeg на несколько ядер, масштабирование добавлением серверов.

Особенности коротких видео: вертикальный формат и мгновенный старт

Для приложений коротких видео решающее значение имеет время до первого кадра, поэтому нужны короткие сегменты, компактная лестница и предзагруженные превью.

# vertical short video: 3-step ladder, 2 s segments for a fast first frame
ffmpeg -i clip.mp4 \
  -filter_complex "[0:v]split=3[a][b][c];[a]scale=1080:-2[v0];[b]scale=720:-2[v1];[c]scale=540:-2[v2]" \
  -map "[v0]" -c:v:0 libx264 -b:v:0 3500k -maxrate:v:0 3750k -bufsize:v:0 5000k \
  -map "[v1]" -c:v:1 libx264 -b:v:1 2000k -maxrate:v:1 2150k -bufsize:v:1 3000k \
  -map "[v2]" -c:v:2 libx264 -b:v:2 1000k -maxrate:v:2 1070k -bufsize:v:2 1500k \
  -map a:0 -map a:0 -map a:0 -c:a aac -b:a 96k \
  -preset medium -force_key_frames "expr:gte(t,n_forced*2)" -sc_threshold 0 \
  -f hls -hls_time 2 -hls_playlist_type vod \
  -hls_segment_filename "short/v%v/seg_%03d.ts" -master_pl_name master.m3u8 \
  -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" short/v%v/index.m3u8

# cover image and a small progressive MP4 preview for feeds
ffmpeg -ss 1 -i clip.mp4 -frames:v 1 -vf scale=540:-2 short/cover.jpg
ffmpeg -i clip.mp4 -t 6 -vf scale=360:-2 -c:v libx264 -b:v 400k -an -movflags +faststart short/preview.mp4
  • Используйте 2-секундные сегменты и предзагружайте первый сегмент следующих роликов в ленте.
  • Для клипов до 60 секунд обычно хватает трёх рендишенов; дополнительные ступени увеличивают объём хранения, почти не улучшая опыт.
  • Создавайте обложки и беззвучные превью при загрузке, чтобы лента отрисовывалась ещё до HLS-запросов.

Объектное хранилище MinIO и горячие/холодные уровни

Храните рендишены в S3-совместимом хранилище на выделенных серверах и распределяйте данные по уровням в зависимости от частоты просмотров.

# single-node MinIO on a storage dedicated server (use distributed mode across 4+ servers for HA)
docker run -d --name minio --restart unless-stopped \
  -p 9000:9000 -p 9001:9001 \
  -v /data/minio:/data \
  -e MINIO_ROOT_USER=vodadmin \
  -e MINIO_ROOT_PASSWORD=replace-with-a-long-random-secret \
  minio/minio server /data --console-address ":9001"

# buckets: raw uploads (private) and hls output (public read via CDN)
mc alias set vod http://127.0.0.1:9000 vodadmin replace-with-a-long-random-secret
mc mb vod/raw
mc mb vod/hls
mc anonymous set download vod/hls
mc ilm rule add vod/raw --expire-days 180      # drop raw uploads after 180 days
mc mirror --overwrite out/ vod/hls/videos/abc123/

MinIO распространяется по лицензии AGPLv3, а схема распространения community-версии со временем менялась, поэтому перед продакшном проверьте актуальную редакцию и лицензию; SeaweedFS, Garage и Ceph RGW — другие S3-совместимые варианты. В примере бакет raw — лишь промежуточная зона загрузки; исходник или мезонинный файл высокого качества сохраняйте в холодном хранилище, чтобы позже можно было перекодировать.

УровеньЧто хранитсяОборудованиеХарактер доступа
ГорячийРендишены новых и популярных видеоСерверы хранения на NVMe/SSDПостоянные запросы от CDN
ТёплыйРендишены «длинного хвоста» каталогаВыделенные серверы с большим HDD RAID или erasure codingРедкие запросы, промахи кэша CDN
ХолодныйИсходники и мезонинные файлыЁмкие HDD-серверы или собственные корпуса хранения в колокацииЧтение только для перекодирования

Грубая оценка: четырёхступенчатая лестница выше в сумме даёт около 10,5 Мбит/с, или примерно 79 МБ на минуту видео. 1 000 часов контента — это около 4,7 ТБ рендишенов плюс исходники.

Доставка через CDN и реальная стоимость трафика

Главная текущая статья расходов видеоплатформы — трафик, а не хранение, поэтому оцените его до выбора серверов.

Активных зрителей в деньВремя просмотра на зрителяСредний битрейт доставкиТрафик в месяц
1 00020 мин1,5 Мбит/соколо 6,75 ТБ
10 00020 мин1,5 Мбит/соколо 67,5 ТБ
50 000 (короткие видео)30 мин1,2 Мбит/соколо 405 ТБ
100 00020 мин1,5 Мбит/соколо 675 ТБ
  • Формула: ТБ в месяц = зрители × минуты × 60 × Мбит/с / 8 / 1 000 000 × 30.
  • Поставьте CDN IMIDC перед HLS-бакетом: чем выше доля попаданий в кэш, тем меньше запросов доходит до серверов хранения.
  • Сегменты и VOD-плейлисты после публикации не меняются — задавайте им длинный Cache-Control и версионируйте пути вместо очистки кэша.
  • Используйте подписанные URL или токены против хотлинкинга, который незаметно сжигает трафик.

Выбор региона: Гонконг или Токио, Сингапур и Лос-Анджелес

Размещайте origin там, где ваши зрители и куда ведут лучшие маршруты.

ЛокацияЛучшая аудиторияМаршруты и IP
ГонконгМатериковый Китай, Гонконг, китайскоязычные пользователиChina Telecom CN2 GIA (AS4809); хостингу не нужна ICP-регистрация
Токио, ЯпонияЯпония, Южная КореяНативные японские IP; на VPS есть опция оптимизированного маршрута CN2
СингапурЮго-Восточная Азия, Индия, ОкеанияНастраивается по запросу через отдел продаж
Лос-Анджелес, СШААмерика, а также пользователи из Китая по премиальным маршрутамМаршруты Unicom 9929/4837 и CN2
Тайбэй / Бангкок / Куала-ЛумпурПлатформы для одного рынкаЛокальные нативные IP

Многие платформы держат один основной origin (часто в Гонконге или Токио) за CDN и добавляют второй, только когда промахи кэша из удалённого региона начинают тормозить.

Авторское право и соответствие требованиям к контенту

Видеоплатформа отвечает за обработку того, что загружают пользователи, поэтому встраивайте комплаенс в конвейер с первого дня.

  • Размещайте только контент, которым владеете или на распространение которого есть лицензия, и требуйте того же от загружающих в пользовательском соглашении.
  • Опубликуйте контакт для правообладателей и процедуру уведомления и удаления (например, уведомления в стиле DMCA), быстро реагируйте на обоснованные жалобы и введите политику для повторных нарушителей.
  • Логируйте аккаунт, IP и время загрузки каждого файла и храните хэши контента, чтобы удалённые видео нельзя было просто загрузить заново.
  • Хостинг-провайдеры пересылают жалобы правообладателей клиентам; отвечайте оперативно, чтобы сервис продолжал работать.
  • Для аудитории в материковом Китае контент должен быть законным, а онлайн-аудиовизуальные сервисы там могут требовать отдельных лицензий. Это общая информация, а не юридическая консультация.

Какая конфигурация IMIDC вам подходит

Начните с одного origin и CDN, а по мере роста библиотеки разделяйте транскодирование и хранение.

Частые вопросы

Какие серверы нужны, чтобы построить платформу коротких видео вроде TikTok для Азии?

Минимум — API-серверы, воркеры транскодирования с ffmpeg, S3-совместимое хранилище вроде MinIO на выделенных серверах хранения и CDN. IMIDC предоставляет выделенные серверы в Гонконге, Токио, Лос-Анджелесе и других локациях Азии, а также CDN IMIDC для такого стека.

Где размещать видеоплатформу: в Гонконге или в Сингапуре?

Выбирайте Гонконг, если много зрителей в материковом Китае: серверы IMIDC там используют China Telecom CN2 GIA, а хостингу не нужна ICP-регистрация. Для Юго-Восточной Азии подходит Сингапур, для Японии и Кореи — Токио; серверы в Сингапуре IMIDC настраивает по запросу через отдел продаж.

Сколько трафика потребляет VOD-платформа?

Умножьте число зрителей на минуты просмотра и средний битрейт: 10 000 зрителей в день по 20 минут при 1,5 Мбит/с — около 67,5 ТБ в месяц. Большую часть должен доставлять CDN, чтобы origin хранения обрабатывал только промахи кэша.

Подходит ли MinIO для хранения видео?

MinIO — широко используемое S3-совместимое хранилище, которое хорошо подходит для HLS-сегментов и исходников на выделенных серверах. Сначала проверьте актуальную лицензию и редакцию; альтернативы — SeaweedFS, Garage и Ceph RGW.

Нужны ли GPU для транскодирования?

Нет. Кодирование на CPU с ffmpeg на многоядерных выделенных серверах даёт лучшее качество на бит и легко масштабируется. GPU ускоряют обработку больших объёмов загрузок — уточните у отдела продаж IMIDC варианты GPU или многоядерных конфигураций.

Готовы строить свою видеоплатформу? Изучите выделенные серверы в Гонконге и CDN IMIDC или откройте тикет — инженеры IMIDC помогут спланировать хранение, транскодирование и доставку.

Помог ли вам данный ответ?

Похожие руководства