MP4 Video – Safari – › Cloudflare – › nginx – › Rails = Нет воспроизведения

Я видел довольно много подобных вопросов и проблем по этому поводу, и я пришел к выводу, что это проблема с Safari, требующая ответа 206, а не 200.

В настоящее время Cloudflare возвращает 200, а не 206, но я не совсем уверен, что где-то еще все правильно настроено.

Это мой метод контроллера Rails, который обслуживает видео:

def videos file_name = params.fetch(:filename, '') file_path = "#{Rails.root}/app/assets/videos/#{file_name}.#{params.fetch(:extension, '')}" raise ActionController::RoutingError, 'Not Found' unless file_name.index('/').nil? && File.exist?(file_path) send_file(file_path, type: 'video/mp4', disposition: 'inline', status: (request.headers['Range'].present? ? 206 : 200)) end

По сути, он проверяет, есть ли / в имени файла (чтобы избежать каких-либо проблем с безопасностью... все видео, обслуживаемые таким образом, находятся в одной папке на сервере), и гарантирует, что файл существует, а затем использует send_file для его доставки, и если присутствует заголовок Range, возвращает статус 206, иначе 200.

Я думаю, что это правильно ... и конфигурация nginx очень проста, в основном просто проходит через puma, но мне совсем не ясно, имеет ли это значение, поскольку заголовок «Range», похоже, не проходит Cloudflare на мой сервер, несмотря ни на что (я сбросил заголовки и ничего не увидел о «Диапазоне»).

Кодировка правильная, тип содержимого/MIME правильный, он отлично работает в Chrome и Firefox, все кажется отличным, за исключением того, что он просто не воспроизводится в Safari.

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

Как заставить эту дурацкую штуку работать в Safari?


person Jason    schedule 24.05.2018    source источник
comment
Вы не можете просто вернуть 206. Вы должны удовлетворить диапазон. т.е. отправляет только те байты, которые он запрашивает, и устанавливает правильные заголовки ответа.   -  person szatmary    schedule 24.05.2018
comment
Насколько можно судить, это связано с тем, как сервер отправляет видео. См.: community.cloudflare.com/t/   -  person Jules    schedule 24.05.2018


Ответы (1)


Это любопытно конкретное название было как раз в моей ситуации. Я подтвердил проблему в соответствии с руководством Apple, указанным ниже, и подтвердил, что загружал весь файл, а после исправления — только первый фрагмент.

curl --range 0-99 http://example.com/test.mov -o /dev/null

Я разрешил воспроизведение Safari .mp4, изменив настройки сжатия gzip в моем nginx.conf, чтобы удалить сжатие gzip файлов .mp4.

Вот блок в nginx для справки. (Примечание: в зависимости от того, как настроено ваше приложение, вам может потребоваться изменить строку местоположения на location ~ \.mp4$ {

location ~ ^/(assets|system|videos)/  {
   expires max;
   add_header Cache-Control public;
   add_header ETag "";
   gzip on;
   gzip_http_version 1.1;
   gzip_vary on;
   gzip_comp_level 6;
   gzip_proxied any;

   # Reference configuration
   #gzip_types text/plain text/html text/css application/json application/javascript application/x-javascript text/javascript video/mp4 application/mp4 image/jpeg image/png image/svg+xml application/x-font-ttf application/x-font-truetype application/font-woff application/font-woff2 application/vnd.ms-fontobject;

   # Kelton trying to fix cloudflare by removing the mp4 settings
   gzip_types text/plain text/html text/css application/json application/javascript application/x-javascript text/javascript image/jpeg image/png image/svg+xml application/application/x-font-ttf application/x-font-truetype application/font-woff application/font-woff2 application/vnd.ms-fontobject;
}

Ссылка на ссылку на документацию Apple: https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/CreatingVideoforSafarioniPhone/CreatingVideoforSafarioniPhone.html#//apple_ref/doc/uid/TP40006514-SW6

person Kelton Temby    schedule 15.12.2019