<video>在其他浏览器中播放,但不在Safari </video>中播放

时间:2014-12-30 21:24:22

标签: html5 video safari mp4

我们网站上有MP4视频;它在Mac上的IE9 +,Firefox,Chrome和Chrome中运行良好。然而,在Safari上,视频根本没有播放 - 它确实触发了一个停顿的&#34;事件,然后没有任何负载。我会发布我们的HTML,但我通过发现即使导航到原始MP4的URL也不会播放Safari来进一步追踪问题。在本地下载和播放时,视频在Quicktime中正常工作。

这是我们所有开发人员中最奇怪的部分,当我从开发计算机运行相关服务器时,可以让视频在Safari上运行。而且,同一目录中的其他MP4文件也有类似的问题。这一直是我的关键,我一直在寻找视频从服务器传输方式的任何微小差异 - 请求/响应标头,精确文件大小等。

从Chrome复制的标题(仅限Safari,因为很难复制/粘贴)

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
DNT:1
Host:*************:8443
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36

Response Headers
Accept-Ranges:bytes
Content-Length:44875102
Content-Type:video/mp4;charset=UTF-8
Date:Tue, 30 Dec 2014 21:11:51 GMT
ETag:W/"44875102-1419959755000"
Last-Modified:Tue, 30 Dec 2014 17:15:55 GMT
Server:Apache-Coyote/1.1

(另外,如果这让你想起旧问题;我知道Windows上的Safari已经死了多年。这个问题发生在OS X上)

编辑:可能有所帮助的新信息。我从我自己的网络服务器上获取了一个个人视频,该视频能够在有问题的Safari浏览器上从那里开始工作,并将其下载到我们服务器的本地视频目录中。 从那里,它遇到与我们其他视频相同的问题。这告诉我MP4本身可能并不重要 - 这可能是我们的Tomcat 7网络服务器的某种服务器问题。我们确实已经正确注册了内容类型,这至少涵盖了基础知识,但我很好奇是否有其他必要的部分。

更多信息:我最初没有提到这一点,但我们正在通过HTTPS连接加载我们的网页和视频。我们的大多数测试服务器都没有有效的证书,因此我们需要点击标准的浏览器警告“#34;此服务器可能不是它所说的&#34;”。我们现在正在研究如何在我们所有的服务器上获得正确的证书。

13 个答案:

答案 0 :(得分:11)

Safari要求网络服务器支持“Range”请求标头,以便播放您的媒体内容。

https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/CreatingVideoforSafarioniPhone/CreatingVideoforSafarioniPhone.html#//apple_ref/doc/uid/TP40006514-SW6

对于合法的“Range”请求响应,您的webserve需要返回状态代码“206”。

答案 1 :(得分:3)

确保控件=&#39; true&#39;类型=&#39;视频/ MP4&#39;在你的HTML代码中给出。

<video loop controls='true' width='100%' height='100%' src='//some_video.mp4' type='video/mp4'></video>

答案 2 :(得分:2)

Safari要求服务器支持字节范围,并且它优先于文件类型后缀而忽略mime类型。

请在https://stackoverflow.com/a/51901198/1047992上查看我的答案

答案 3 :(得分:2)

我上传了一个新的MP4文件,但只能在SAFARI中播放(在我的MAC和iPhone上),而不是Chrome,Oasis,Firefox或Brave。 HTML代码与以前的成功相同。文件大小和尺寸都可以。但是旧的工作文件上的编解码器是“ H.264,AAC”。新的非工作文件上的编解码器为“ MPEG-4,AAC”。我在VideoPad上编辑我的视频文件。因此,我查看了“将文件导出为”选项上的规范选择,可以肯定的是,编解码器默认为MPEG-4。我选择了H.264并导出了文件。上传到AWS并公开。在四个故障浏览器和BINGO!中重试了我的新文件,它们都可以工作。有神!

答案 4 :(得分:1)

这可能确实是缺少字节范围支持的问题,具体取决于您使用的版本。它被添加到MAGNOLIA-3855中的DMSDownloadServlet(Magnolia修订版4.4.6)。

答案 5 :(得分:1)

碰到同样的问题。所有标题,范围等都是正确的。但是,我的服务人员素质很差。所有其他浏览器都处理了故障,而Safari没有。暂时删除了服务人员,一切恢复正常。

答案 6 :(得分:0)

...

另一方面,charset对视频/ mp4类型有什么意义吗?尝试删除它上面的字符集。

编辑:是的,charset可能是问题,请参阅:Specify content-type for documents uploaded in Magnolia

EDIT2:没有charset,woops,阅读理解失败。可能是字节范围? 引用:“[...]我们发现Safari / iOS”使用HTTP字节范围来请求音频和视频文件。“现在我们猜测Magnolia DMS文件服务不支持此功能,因此流媒体失败“。

答案 7 :(得分:0)

如果您将这些内容添加到.htaccess

会怎样?
AddType video/ogg .ogv
AddType video/mp4 .mp4
AddType video/webm .webm

答案 8 :(得分:0)

最近,我的团队遇到了导致相同行为的特定问题。我们使用Apache 2.4并注意到如果我们启用了诸如.htpasswd的身份验证层,即使在身份验证后,Safari也不会显示视频。这几乎就好像它不会继续遵守某些类型的后续HTTP请求的初始身份验证许可。

抱歉,我没有更多技术可供提供,但只有在Safari中才能检查遇到视频问题的人。

答案 9 :(得分:0)

我遇到了同样的问题并解决了它,但没有其他答案在我这里没有涉及到,所以我仍然会在这里留下解决方案。

我一直在制作自己的视频流服务器,在质疑的情况下,它只会返回一个&#34; Ranged&#34; mp4文件,我发现Safari不播放HTTP响应中携带的视频缺少&#34; Connection&#34;响应标题由于某种原因。

答案 10 :(得分:0)

请原谅我,如果您已经解决了这个问题! 我在Safari中的服务器视频遇到了同样的问题。我能够使用POSTMAN / INSOMNIA来解决此问题,以检查服务器正在发送的标头。 Chrome可以欺骗您,一旦在该浏览器中可以正常播放视频!

如果视频不在范围内(完整视频请求),则您的服务器必须返回状态(200),并检查是否从您的服务器发送了“接受范围:字节”。 标头样本状态200:

Server: nginx
Date: Wed, 25 Jul 2018 17:34:18 GMT
Content-Type: video/mp4
Content-Length: 22995782
Connection: keep-alive
X-Powered-By: Express
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, PATCH, DELETE
Access-Control-Allow-Headers: X-Requested-With,content-type
Access-Control-Allow-Credentials: true
Accept-Ranges: bytes

如果视频范围很广,则服务器必须正确返回带有范围标头的状态(206)。 标头样本状态206:

Server: nginx
Date: Wed, 25 Jul 2018 18:13:07 GMT
Content-Type: video/mp4
Content-Length: 1023
Connection: keep-alive
X-Powered-By: Express
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, PATCH, DELETE
Access-Control-Allow-Headers: X-Requested-With,content-type
Access-Control-Allow-Credentials: true
Accept-Ranges: bytes
Content-Range: bytes 1-1023/22995782

希望对您有所帮助!我最诚挚的问候, 保罗·杜索(PauloDurço)

答案 11 :(得分:0)

就我而言,我需要从轨道标签中删除默认属性:

<track default kind='captions' />

以防其他人遇到此问题。

答案 12 :(得分:-1)

Safari和iPhone需要“ Range”请求标头才能播放媒体内容。 您必须在服务器端处理Range。

        if (request.getHeader("Range") != null) {
            System.out.println("Inside range ");


            System.out.println("range value "+request.getHeader("range"));
        //  String fileLocation = melpUploadFiles.getFilethumbPath();
            resfilename=melpUploadFiles.getFilename();

            response.setStatus(206);
            String rangeValue = request.getHeader("range").trim().substring("bytes=".length());


            File fileloc= new File(melpUploadFiles.getFilePath());
             long fileLength = fileloc.length();
            long start, end;
            if (rangeValue.startsWith("-")) {
                end = fileLength - 1;
                start = fileLength - 1 - Long.parseLong(rangeValue.substring("-".length()));
            } else {
                String[] range = rangeValue.split("-");
                start = Long.parseLong(range[0]);
                end = range.length > 1 ? Long.parseLong(range[1]) : fileLength - 1;
            }
            if (end > fileLength - 1) {
                end = fileLength - 1;
            }
            if (start <= end) {

             System.out.println("inside  response block");

                long contentLength = end - start + 1;
                response.setHeader("Content-Length", contentLength + "");
                response.setHeader("Content-Range", "bytes " + start + "-" + end + "/" + fileLength);
                response.setHeader("Content-Type", "video/mp4");
                response.setHeader("Accept-Ranges","bytes");
                response.setHeader("ETag","\"a226e70476837efa4df4b4bfd75366c4\"");
                response.setHeader("Server", "Apache");
                response.setHeader("Last-Modified",System.currentTimeMillis()+"");
                response.setDateHeader("Expires", System.currentTimeMillis() + 604800000L);


            //  response.setHeader("Content-Disposition", "inline; filename="+resfilename+"");
                RandomAccessFile raf = new RandomAccessFile(fileloc, "r");
                raf.seek(start);
                output = response.getOutputStream();
                byte[] buffer = new byte[2096];
                int bytesRead = 0;
                long totalRead = 0;

                System.out.println("content length "+contentLength);

                while(totalRead<contentLength) {

                    bytesRead = raf.read(buffer);
                    totalRead += bytesRead;
                    output.write(buffer, 0, bytesRead);
                    }
            }
        } 

其他 { 对于其他浏览器 }