0

Я использую Rails 4 для моего веб-приложения, и я использую VideoJS, чтобы показать его, как:Rails 4 - Как обслуживать видео?

<video id="video1" class="video-js" controls preload="auto" width="640" height="264" poster="{{pCtrl.video.poster}}" src="<%= @video.file %>"> 
     <source src="<%= @video.file %>" type="video/<%= @video.file.file.filename.last(3) %>"> 
</video> 

Я всегда получаю эту ошибку из VideoJS:

VIDEOJS: ERROR: (CODE:3 MEDIA_ERR_DECODE) The video playback was aborted due to a corruption problem or because the video used features your browser did not support. 

Когда я открываю Я разработал инструменты Chrome, я вижу, что видео (файл 340Mb .mp4) загружается со статусом 206 (частичное содержимое) и всего 2,8 Мб.

Я думал, что это была проблема с VideoJS, но затем я попытался получить доступ непосредственно, как «http://localhost:3000/uploads/video/file/glrbfmso1449450792.mp4»

видео будет играть в течение нескольких секунд, а затем замерзает, и он не будет играть, если я не обновлю страница. Я думаю, что он загружает только 2,8 МБ. Поэтому я считаю, что это имеет какое-то отношение к WEBrick.

Проблема не в видеофайле, так как он нормально работает на VLC и когда я использую Glassfish (программирование на Java).

Мой вопрос: есть ли что-то, что я должен настроить в Rails или WEBrick? Есть ли какие-либо настройки, которые я должен изменить? Или это то, что я переживаю необычно?

+0

Вы передаете это видео, хотя приложение или веб-сервер обрабатывает его? – Stewart

+0

Что это значит? Это похоже на youtube. Вы загружаете HTML-страницу с тегом «видео».Я обновлю свой вопрос – Aleksandrus

+0

Где находится видео? – Stewart

ответ

6

Не используйте рельсы для работы с видеофайлами. Хотя серверы, такие как единорог, поддерживают потоковые видеофайлы, есть несколько причин, почему это плохая идея. Здесь очень разные связи. Приложение для рельсов обычно должно принимать не более ~ 200 мс, чтобы вернуть ответ. Когда ваше потоковое видео не будет необычным для того, чтобы соединение оставалось открытым дольше.

Почему это имеет значение? Рассмотрим на какой-то момент, что rails web sever предназначен для запуска кода ruby ​​и создания вывода на основе текста. Чтобы сделать это как можно быстрее, очень умные люди принимают ряд решений при написании таких серверов, как puma и raptor. В случае с raptor я знаю, что они никогда не выделяют новый объект во время выполнения, поскольку это слишком дорого. Вместо этого они поддерживают пул объектов для обработки входящих запросов. Запрос будет передан, а затем выпущены объекты в пуле. Это нормально для коротких запросов, но что, если у вас всего 5 объектов в вашем бассейне? У вашего ранга очень быстро закончится соединение, как только у вас будет 5 человек, которые смотрят видео на вашем сайте. В то время как это происходит, ваш сайт недоступен для всего остального мира. Подробнее о том, как работают раптор, см. http://www.rubyraptor.org/how-we-made-raptor-up-to-4x-faster-than-unicorn-and-up-to-2x-faster-than-puma-torquebox/

Другая причина - использование памяти. Сервер rails делает гораздо более сложную и высокоуровневую обработку, чем nginx. В нем есть умение, как подключение к базам данных и сеансы передачи. Эти вещи не приходят бесплатно и стоят на вашем сервере. Интерфейсный сервер, такой как nginx, не имеет каких-либо из этих накладных расходов и может обслуживать видео файлы точно так же.

В идеале рельсы не должны обслуживать статические активы, такие как JS и CSS. Лучше сконфигурируйте свой веб-сервер с прямым доступом, чтобы сделать это прямо на клиента. У вас будет меньше накладных расходов. Видео - это еще одна проблема. Я бы предложил посмотреть внешний хостинг, созданный для размещения видео. У Amazon есть S3, и я уверен, что есть несколько других.

Тот же аргумент будет использоваться для WEBRick. Это сервер разработки, который даже не имеет возможности компилироваться. Это чистый рубин, так что это будет еще хуже, чем сказать raptor или puma.

+0

Не могли бы вы объяснить, почему? Информация, которую вы предоставили, очень интересна. Что делает Rails отличным вариантом для потокового видео? Кроме того, я буду поддерживать, но не принимаю ответ, поскольку он на самом деле не отвечает за меня. – Aleksandrus

+1

Эй, спасибо за комментарий. Я расширил свой ответ. Пожалуйста, не стесняйтесь разобрать его, и я сделаю еще несколько исследований для вас. – Stewart

+0

Благодарим вас за разъяснения. Могу ли я предложить вам также опубликовать ссылку на ваши исследования? Я был большим поклонником Rails после работы с JSP и PHP. Эти вещи здорово знать, поэтому я могу выбрать более подходящий язык/фреймворк/сервер, в зависимости от приложения – Aleksandrus

Смежные вопросы