Start typing to search across invoices, services, domains, tickets, and more...
Бэкенду платформы видео по запросу (VOD) или коротких видео нужны четыре компонента: выделенные серверы хранения для исходников и рендишенов, конвейер транскодирования на ffmpeg с выводом HLS-лестниц битрейтов, S3-совместимое объектное хранилище вроде MinIO и CDN, который берёт на себя основную часть трафика. IMIDC предоставляет эту инфраструктуру в Гонконге (CN2 GIA в материковый Китай), Токио, Сингапуре, Лос-Анджелесе и других локациях Азии: выделенные серверы в Гонконге от $139/мес, в Лос-Анджелесе от $499/мес, аплинки 10 Гбит/с, защита от DDoS и CDN IMIDC.
Любая видеоплатформа проходит один и тот же путь: загрузка, хранение исходника, транскодирование, хранение рендишенов, доставка через CDN.
master.m3u8 с CDN, а CDN забирает недостающие сегменты с origin хранения.Метаданные (названия, владельцы, просмотры, статус модерации) храните в обычной БД на API-сервере, а сами байты — на серверах хранения.
Кодируйте каждое видео сразу в несколько разрешений с выровненными ключевыми кадрами, чтобы плеер плавно переключал качество.
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) | Битрейт видео | Аудио | Типичный зритель |
|---|---|---|---|---|
| 1080p | 1920x1080 | 5 000 кбит/с | 128 кбит/с AAC | ПК, ТВ, Wi-Fi |
| 720p | 1280x720 | 2 800 кбит/с | 128 кбит/с AAC | Смартфоны на хорошем 4G/5G |
| 480p | 854x480 | 1 400 кбит/с | 128 кбит/с AAC | Перегруженные мобильные сети |
| 360p | 640x360 | 800 кбит/с | 128 кбит/с AAC | Слабый сигнал, режим экономии трафика |
-force_key_frames "expr:gte(t,n_forced*2)" ставит ключевой кадр каждые 2 секунды независимо от частоты кадров, а -sc_threshold 0 выравнивает их между рендишенами.Для приложений коротких видео решающее значение имеет время до первого кадра, поэтому нужны короткие сегменты, компактная лестница и предзагруженные превью.
# 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
Храните рендишены в 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 ТБ рендишенов плюс исходники.
Главная текущая статья расходов видеоплатформы — трафик, а не хранение, поэтому оцените его до выбора серверов.
| Активных зрителей в день | Время просмотра на зрителя | Средний битрейт доставки | Трафик в месяц |
|---|---|---|---|
| 1 000 | 20 мин | 1,5 Мбит/с | около 6,75 ТБ |
| 10 000 | 20 мин | 1,5 Мбит/с | около 67,5 ТБ |
| 50 000 (короткие видео) | 30 мин | 1,2 Мбит/с | около 405 ТБ |
| 100 000 | 20 мин | 1,5 Мбит/с | около 675 ТБ |
Cache-Control и версионируйте пути вместо очистки кэша.Размещайте origin там, где ваши зрители и куда ведут лучшие маршруты.
| Локация | Лучшая аудитория | Маршруты и IP |
|---|---|---|
| Гонконг | Материковый Китай, Гонконг, китайскоязычные пользователи | China Telecom CN2 GIA (AS4809); хостингу не нужна ICP-регистрация |
| Токио, Япония | Япония, Южная Корея | Нативные японские IP; на VPS есть опция оптимизированного маршрута CN2 |
| Сингапур | Юго-Восточная Азия, Индия, Океания | Настраивается по запросу через отдел продаж |
| Лос-Анджелес, США | Америка, а также пользователи из Китая по премиальным маршрутам | Маршруты Unicom 9929/4837 и CN2 |
| Тайбэй / Бангкок / Куала-Лумпур | Платформы для одного рынка | Локальные нативные IP |
Многие платформы держат один основной origin (часто в Гонконге или Токио) за CDN и добавляют второй, только когда промахи кэша из удалённого региона начинают тормозить.
Видеоплатформа отвечает за обработку того, что загружают пользователи, поэтому встраивайте комплаенс в конвейер с первого дня.
Начните с одного origin и CDN, а по мере роста библиотеки разделяйте транскодирование и хранение.
Минимум — API-серверы, воркеры транскодирования с ffmpeg, S3-совместимое хранилище вроде MinIO на выделенных серверах хранения и CDN. IMIDC предоставляет выделенные серверы в Гонконге, Токио, Лос-Анджелесе и других локациях Азии, а также CDN IMIDC для такого стека.
Выбирайте Гонконг, если много зрителей в материковом Китае: серверы IMIDC там используют China Telecom CN2 GIA, а хостингу не нужна ICP-регистрация. Для Юго-Восточной Азии подходит Сингапур, для Японии и Кореи — Токио; серверы в Сингапуре IMIDC настраивает по запросу через отдел продаж.
Умножьте число зрителей на минуты просмотра и средний битрейт: 10 000 зрителей в день по 20 минут при 1,5 Мбит/с — около 67,5 ТБ в месяц. Большую часть должен доставлять CDN, чтобы origin хранения обрабатывал только промахи кэша.
MinIO — широко используемое S3-совместимое хранилище, которое хорошо подходит для HLS-сегментов и исходников на выделенных серверах. Сначала проверьте актуальную лицензию и редакцию; альтернативы — SeaweedFS, Garage и Ceph RGW.
Нет. Кодирование на CPU с ffmpeg на многоядерных выделенных серверах даёт лучшее качество на бит и легко масштабируется. GPU ускоряют обработку больших объёмов загрузок — уточните у отдела продаж IMIDC варианты GPU или многоядерных конфигураций.
Готовы строить свою видеоплатформу? Изучите выделенные серверы в Гонконге и CDN IMIDC или откройте тикет — инженеры IMIDC помогут спланировать хранение, транскодирование и доставку.