потоковое видео через несколько серверов

354
sanjihan

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

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

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

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

enter image description here

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

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

0

1 ответ на вопрос

2
slhck

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

Во-первых, большие потоковые сайты используют сети доставки контента (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.

Спасибо за подробный ответ. CDN кажется подходящим в большинстве случаев. Причина, по которой я хотел бы передавать через прерывистый сервер, заключается в том, чтобы скрыть расположение серверов хранения. Я нашел вопрос и ответ, который предлагает решение https://stackoverflow.com/questions/38417350/php-curl-realtime-proxy-stream-file#answer-38418060, но я смог только напрямую загрузить видеофайл. Когда я попытался установить атрибут `src` в теге html video для сценария php, я получил ошибку 400. Известно ли вам о каком-либо решении этой проблемы? sanjihan 5 лет назад 0
Ах, ошибка 400 была моей плохой. Это работает сейчас, но id ждет загрузки файла. Я проверю, связано ли это с атомом moov sanjihan 5 лет назад 0
да, кажется, код в q & a отлично работает на моих локальных компьютерах. sanjihan 5 лет назад 0
Может быть, атом Moov, да. Если вы действительно хотите скрыть местоположение, опция прокси через PHP может сработать, но вы направляете все через один сервер, который не идеален с точки зрения производительности. slhck 5 лет назад 0