我们网站上有MP4视频;它在Mac上的IE9 +,Firefox,Chrome和Chrome中运行良好。然而,在Safari上,视频根本没有播放 - 它确实触发了一个停顿的"事件,然后没有任何负载。我会发布我们的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;此服务器可能不是它所说的"”。我们现在正在研究如何在我们所有的服务器上获得正确的证书。
答案 0 :(得分:11)
Safari要求网络服务器支持“Range”请求标头,以便播放您的媒体内容。
对于合法的“Range”请求响应,您的webserve需要返回状态代码“206”。
答案 1 :(得分:3)
确保控件=' true'类型='视频/ MP4'在你的HTML代码中给出。
<video loop controls='true' width='100%' height='100%' src='//some_video.mp4' type='video/mp4'></video>
答案 2 :(得分:2)
Safari要求服务器支持字节范围,并且它优先于文件类型后缀而忽略mime类型。
答案 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);
}
}
}
其他 { 对于其他浏览器 }