MP4 视频 - 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,但我完全不清楚这是否重要,因为"范围"标头似乎没有通过 Cloudflare 到达我的服务器,无论如何(我转储了标头并且没有看到有关"范围"的任何内容(。

编码是正确的,内容/MIME类型是正确的,它在Chrome和Firefox上运行良好,一切似乎都很棒,除了它不能在Safari中播放。

我今天花了很大一部分时间试图弄清楚这一点,我尝试了很多不同的东西,但我根本没有进一步的想法。

如何让这个愚蠢的东西在 Safari 上工作?

这个奇怪的具体标题正是我的情况。 我根据下面列出的Apple指南确认了该问题,并验证了我正在下载整个文件,并且在修复后仅下载了第一个块。

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

我通过在nginx.conf中更改gzip压缩设置来解决我的Safari.mp4播放问题,以删除.mp4文件的gzip压缩。

这是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

在开始更改nginx配置之前,您可能需要检查mp4是否使用了所有主要浏览器供应商支持的编解码器。

举个例子:我正在使用这个ffmpeg命令为WordPress网站创建一个背景视频:

ffmpeg -i input.mov -vcodec libx265 -crf 32 -an output.mp4

当我上传它时,WordPress给了我这个错误,视频无法播放:

Media error: Format(s) not supported or source(s) not found

我错误地认为这是Cloudflare或nginx的问题。问题是,至少在这个时间点,只有Microsoft Edge(版本 16 及更高版本(和 Safari(版本 11 及更高版本(支持 H.265。我应该使用 H.264:

ffmpeg -i input.mov -vcodec libx264 -crf 32 -an output.mp4

我重新上传了视频,它工作正常。

最新更新