HTML5 视频在 IE 中播放失败(或:缺少范围请求)

spa*_*guy 5 html video internet-explorer http-headers

我为之前在 SO 上问过一万次的问题而道歉。这种情况似乎与其他情况不同。简而言之,通过 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>
Run Code Online (Sandbox Code Playgroud)

streamvideo.rails 是 Castle Monorail C# 函数,它获取云服务器中的视频文件作为 Stream 并将其作为范围请求流式传输回来。

首先,我确定这不是常见的问题:编解码器可能没问题,响应的 Content-Type 是正确的(视频/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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我推测如果我解决这个差异,问题就会消失。那么:为什么 IE 决定不发出范围请求?我怎样才能强迫它?如果你认为我在寻找虚假线索,我还能检查什么?

小智 0

我在 Android 上使用 Chrome 时遇到了同样的问题。范围标头丢失。对于 Internet Explorer,我做了这样的事情:

$http_range = (isset($_SERVER["HTTP_RANGE"])) ? $_SERVER["HTTP_RANGE"] : "bytes-0"; 
Run Code Online (Sandbox Code Playgroud)

这就是我的 PHP 脚本,它提供视频/mp4 数据。它所做的只是检查是否设置了范围标头,如果没有,它将假设已请求文件的开头。Internet Explorer 似乎足够聪明,可以在用户寻求视频的不同部分时接管,即生成所需的范围标头。

在 IE 中工作得很好...但是,我在 Chrome 中尝试了上述方法,但仍然不满意:((