Ултимейт Гайд за създаване на отпорен видео-поток и обработка на данни
Големият водач за разработчици по създаването на производствена степен видео-поток от нула, който обхваща повторно изпращане на данните, преобразуване с FFmpeg, пакетиране HLS и сигурна облакова памет.

Има ли някои проблеми с добавянето на видеозаписи в приложението? Като инженер, да бъдете попитани да “добавите видеозаписи” към приложение може да изглежда много просто. <input type="file">
и POST запит, нали? В действителност създаването на система, която е устойчива, масово-скалабилна и предлага добра потребителска опитност е голяма задача – цяло самостоятелно производство.
Тази справка е за разработчици, които искат да разберат какво действително се изисква от създаването на видеопоток от първи принципи. Ние ще архитектурите целия поток, от браузера на потребителя до глобалната доставка на услуги, разглеждайки сложностите и скритите изправения във всяка фаза.
Архитектурна обзор: Четирите стълба на видеопоток
Производството на висококачествена видеоинфраструктура се основава на четири колони. Вие трябва да създадете, управлявате и масово-скалабилните всяка от тях.
- Вхъд: Устойчиво получаване на големи видеофайлове от устройството на потребителя до системата ви.
- Обработване: Промяна на необработения видеофайл в различни формати, подходящи за всяка гледача на всяко устройство.
- Съхранение: Безопасно и устойчиво съхраняване както на оригиналния файл, така и на обработените версии.
- Доставка: Доставяне на видеото до крайните потребители с ниски задръствания и висока изработка, навсякъде в света.
Нека създадем всяка колона от основа.
Стълб 1: Създаване на устойчиво вхъдно слое
Стандартен HTTP запит ще се разпадне или ще кръшна браузерската табла при опит да заредите видеофайл от 1 GB. Ние трябва да създадем по-сложена клиентска решението.
Клиент за възобновяемо зареждане
Целта е да създадем uploader, който оцелява при смяна на мрежата и браузерските рестарти. Това се постига чрез сеченето.
- Сечение на файла: В JavaScript можете да използвате метода
File.prototype.slice()
за да разбияте големия файл в по-малки, номерирани сечения (например 5MB всяко). - Checksums: За всеки сегмент трябва да изчислите checksum (като MD5 или SHA-1 хеш) на клиента. Това позволява сървъра да потвърди целостта на всеки сегмент при пристигането, защитавайки се от корупция по време на транспорт.
- Симултанно зареждане на сечения: За максимизиране на скоростта можете да използвате
Promise.all
или работна пулта за зареждането на множество сечения (например 3-4) едновременно. - Управление на състоянието: Клиентът трябва да следи състоянието на всеки сегмент:
pending
,зареждане
,провалено
,завършено
. Състоянието трябва да бъде запазено вlocalStorage
, така че ако потребителят случайно затвори таблата, зареждането може да бъде продължено от началото. - Повторение с експоненциален обратен отсрочване: Когато сеченият зареждане провали, не повторявайте веднага. Implementирате експоненциално обратно стратегия (чакай 1 секунда, след това 2 секунди, след това 4 секунди) за да изпадете от временно сървъра или мрежови проблеми.
Стълб 2: Гигантската задача на видеообработването
След като необработеният файл е сглобен в сървъра (вероятно EC2 инстанция или подобна ВМ), най-компютационно-тежкото работи започва: transcoding.
Зачето на transcoding
Оригиналният файл е безполезен за стрийминг. Той е твърде голям и в един формат. Transcoding създава множество версии (рендитии) за да сервира всеки потребител идеално.
Вашият нов любимец и най-големият враг: FFmpeg
FFmpeg
е мощната отворена-кодова система за видео. Вие ще трябва да инсталирате го на обработватите сървъри и да научите да управлявате аркания му команден синтаксис. Обикновеният workflow за един видеофайл включва:
- Изследване на входния файл: Първо, използвайте
ffprobe
за да инспектирате свойства на източния видеофайл: неговата резолюция, битрейта, кодеките и кадровият скорост. Вие имате нужда от тази информация, за да направите умни решения за transcoding. - Създаване на видеорендиции: Вие ще изпълнявате серия от FFmpeg команди. За един 1080p източник, например, може да създадете:
- 1080p рендиция при ~5 Mbps
- 720p рендиция при ~2.5 Mbps
- 480p рендиция при ~1 Mbps
- 360p рендиция при ~600 Kbps
Например, следния команд е ужасяващо сложен:
ffmpeg -i input.mp4 \
-c:v libx264 -preset slow -crf 22 \
-s 1280x720 -b:v 2500k \
-c:a aac -b:a 128k \
-profile:v high -level 4.1 \
output_720p.mp4
Вие трябва да направите това за всеки качествен ниво.
-
Пакетиране за адаптивна битрейта стрийминг (ABS): Поединични MP4 файлове не са достатъчни за истинска стрийминг. Вие трябва да пакетирате ги в формат като HLS. Това включва друга FFmpeg команда, която взема всички вашите MP4 рендиции и разделят ги на малки видеосегменти (например 2-4 секунди) и генерира
.m3u8
файл за манифест. Този манифест е “плейлиста”, която съобщава на видеоиграта, които сегменти да изискват. -
Създаване на миниатюри и предгледи: Вие имате нужда от визуални предгледи.
- Статична миниатюра: Използвайте FFmpeg за да извадите един кадър от средата на видеото.
- Анимационен предглед (Storyboard/Scrubbing): Извадете кадър всеки 5 секунди, сплайт ги заедно в една “спрайт шийт” картинка и генерирайте VTT файл, който мапира времеви кодове на координати на спрайт шийта.
Сървърът за обработване е буталник. Вие имате нужда от видеообработването да бъде много CPU-тягач. Един 10-минутен видеофайл може да задръжне сървъра с множество ядра за няколко минути. Обработване на стотици видеа едновременно изисква сложна, аутомасово-скалабилна флотилия от посветени “работни” сървъри, работна пулта (като RabbitMQ или SQS), и силно заета система за управление на грешките.
Стълб 3: Създаване на устойчиво съхранение
След като видеофайловете са обработени, трябва да бъдат запазени в безопасно и устойчиво място.
Управление на сървъра за съхранение
Вие имате нужда от да управлявате сървъра за съхранение, така че да може да се достапят видеофайловете в безопасен и устойчив начин.
Създаване на репликации
Вие трябва да създадете репликации на видеофайловете, така че да могат да бъдат достъпни в случай на авария или други проблеми с достъпа.
Стълб 4: Създаване на доставка
След като видеофайловете са съхранени и репликовани, трябва да бъдат доставяни до крайните потребители.
Управление на сървъра за доставка
Вие имате нужда от да управлявате сървъра за доставка, така че да може да се доставят видеофайловете в безопасен и устойчив начин.
Създаване на репликации
Вие трябва да създадете репликации на видеофайловете, така че да могат да бъдат достъпни в случай на авария или други проблеми с достъпа.