我为之前问过一万次询问问题而道歉。这种情况似乎与其他情况不同。简而言之,视频播放始终适用于Firefox和Chrome,但在Internet Explorer,所有版本,所有Windows版本中始终失败。
我根据Microsoft的HTML5建议设置了一个网页。模态窗口提供视频:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
</head>
<body>
<div class="popupwindow">
<video controls autoplay preload="auto" style="width:100%">
<source src="streamvideo.rails?file=$fileName" type="video/mp4" />
</video>
</div>
</body>
</html>
streamvideo.rails是Castle Monorail C#功能,它将云服务器中的视频文件作为Stream获取,并将其作为范围请求流回。
首先,我确定这不是通常的问题:编解码器可能没问题,响应的内容类型是正确的(视频/ mp4),IE甚至可以正确地获取视频,至少在最初阶段。浏览器中的网络嗅探器显示它收到了一小块MP4文件,然后停止了。
我注意到一个奇怪的问题:IE并未将视频请求定义为范围请求,而Chrome / FF则是。 Chrome的标题:
GET [my URL]?fileName=e65b0b0d-0911-4e3f-bc71-7b5d5a65db57.mp4 HTTP/1.1
Host: localhost
Connection: keep-alive
Accept-Encoding: identity;q=1, *;q=0
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36
Accept: */*
DNT: 1
Accept-Language: en-US,en;q=0.8
Range: bytes=0-6130
IE的标题:
GET [same URL] HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept: */*
GetContentFeatures.DLNA.ORG: 1
Pragma: getIfoFileURI.dlna.org
Accept-Language: en-US
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
DNT: 1
Host: localhost
我推测如果我解决这个差异,问题就会消失。那么:为什么IE决定不发出范围请求?我怎么强迫它?如果你认为我正在追逐一个虚假的线索,我还能检查什么?
答案 0 :(得分:1)
回复有点迟了。只是想如果有人搜索这个,我的答案会帮助他们。我发现当IE请求视频内容时,&#34; Accept-Ranges:Bytes&#34;标题不存在与Firefox和Chrome一样,因此在第一次请求时设置响应如下(这是一个ASP.Net Core示例):
response.Headers.Add("Accept-Ranges", "bytes");
response.ContentLength = [length of actual video file];
response.StatusCode = (int)HttpStatusCode.OK;
response.ContentType = [ContentType of requested content];
当响应再次点击浏览器时,它将评估标题并设置视频控件以及具有正确标题的下一个请求。现在,当您验证Range标头的存在时,它将存在,并且流的代码将正常工作。
希望这有帮助,它对我有用。
答案 1 :(得分:1)
详细说明让·鲁(Jean Roux)的回应:
通过范围请求和响应支持HTML5视频流。 MDN有一个很好的介绍:https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests
W7和W8上的IE10和IE11不会发出范围请求(没有范围标头)。根据RFC,服务器可能会以200响应和整个文件内容进行响应。但这会导致IE无法播放文件(我不确定为什么,但是基于开发工具中的“网络”标签,内容被截断了,例如服务器发送了约10MB的内存,但IE只是查看了前几KB) 。我必须重新设置服务器的位置,以便响应206,整个文件内容以及Accept-Ranges和Content-Range标头。
顺便说一句:您在发布W10之前曾问过这个问题。 W10上的Edge和IE11都发出范围请求。
答案 2 :(得分:0)
我在Android上使用Chrome时遇到了同样的问题。范围标题丢失。对于Internet Explorer,我做了类似这样的事情:
$http_range = (isset($_SERVER["HTTP_RANGE"])) ? $_SERVER["HTTP_RANGE"] : "bytes-0";
在我的PHP脚本中提供视频/ mp4数据。它只是检查是否设置了范围标题,如果没有,它将假定已经请求了文件的开头。 Internet Explorer似乎足够智能,如果用户寻求视频的不同部分,即生成所需的范围标题,则接管。
在IE中运行良好...但是,我在Chrome中尝试了以上内容并且它仍然不满意:((
答案 3 :(得分:0)
我遇到了同样的问题。
MIME设置正确。这是视频/ mp4。
我检查了apache配置。它支持video / mp4和audio / mp4。
视频由H.264编码。
我可以在Chrome中看到视频,而不是IE(从9,10,11开始)。
我将视频大小从1920 x 1280更改为720 x 720并进行了编码。
它神奇地工作。
现在我正在通过更改视频的宽度和高度来搜索它的工作原理。