У меня особенная проблема.

Сервер - это сервер, с которым взаимодействуют пользователи. Серверы 2B, 2C и 2D хранят видео контент.

На веб-сайте размещен тег HTML видео

<video src="server1adomain.com/videos?video=Gy12C899">

Всякий раз, когда этот контент извлекается, серверный сценарий на сервере 1А определяет, на каком сервере (2В, 2С или 2D) видео хранится, и извлекает его. Допустим, это на 2B. Я не хочу ждать, пока все видео будет извлечено из 2B и сохранено на сервере 1A, и только после того, как все это время будет отправлено пользователю. Вместо этого я хотел бы, чтобы непрерывный поток передавался от 2B до 1A и пользователю одновременно. Таким образом, пользователь получает первые кадры видео с минимальной задержкой.

Каково стандартное решение этой проблемы? Я посмотрел на src видео на YouTube, и все они, кажется, получены из одного домена, поэтому такой подход должен быть возможным.

1 ответ1

2

Есть несколько решений, которые являются более или менее отраслевым стандартом. Я бы рекомендовал не придумывать другие хакерские решения вашей проблемы.

Во-первых, большие потоковые сайты используют сети доставки контента (CDN), где размещается фактический контент. Эти серверы отличаются от веб-серверов (на которых размещена веб-страница или сценарии) и работают независимо; их основная цель - размещать видеоконтент и хранить его ближе к местоположению пользователя. Работа вашего веб-приложения заключается в замене ссылки на источник видео, который указывает на сервер A, прямой ссылкой на сервер контента - в зависимости от того, что ближе к пользователю, или от того, который отвечает быстрее (типичный случай балансировки нагрузки). В случае ваших серверов второго уровня вы должны настроить на них веб-сервер (например, Nginx) и напрямую связываться с видео.

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

Убедитесь, что ваши видео, если они являются файлами MP4, имеют атом MOOV в начале файла. Это уменьшает задержку запуска, так как клиент может начать воспроизведение, даже если весь файл еще не передан. С помощью ffmpeg вы можете сделать это, добавив параметр -movflags +faststart во время кодирования (используйте ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4 чтобы просто исправить существующий файл). Или используйте программу qt-faststart (или ее реализацию ) для существующего файла.

Наилучшим вариантом будет сопряжение подхода CDN с использованием адаптивной потоковой передачи HTTP (DASH или HLS). Здесь вместо простого HTML5-источника видео, который, скорее всего, представляет собой один большой файл, вы бы транслировали отдельные фрагменты видео. Это приводит к более быстрому запуску и лучшей обработке различной пропускной способности клиента. Тем не менее, это гораздо сложнее настроить с нуля. Конечно, есть поставщики, которые предлагают потоковые решения DASH-типа, где вам просто нужно предоставить им исходное видео, и вы можете внедрить их проигрыватель на своем веб-сайте. Они позаботятся о кодировании и CDN. Некоторыми примерами являются Bitmovin, Encoding.com или Wowza.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .