0

我正在使用 NetStream、NetConnection 和 Video 对象播放一个使用 http 托管在 Web 服务器上的 mp4 文件。

mp4 文件 URL 例如:http://xx.xx.xx.xx/file.mp4

这是一个 AIR 应用程序,相关代码粘贴在下面:


var url:String = <some http url>;

connect_nc = new NetConnection();
connect_nc.connect(null);

stream_ns = new NetStream(connect_nc);

var ns_object:Object = new Object();
ns_object.onPlayStatus = ns_onPlayStatus;

stream_ns.client = ns_object;
videoMP4.attachNetStream(stream_ns);           

stream_ns.bufferTime = 1.0 // 1 sec       
stream_ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatusEventHandler);
stream_ns.play(url);

此代码在 MAC OS X 上运行时有效。但在 Windows XP 上运行时无效。我得到错误:

NetStream.Play.StreamNotFound

我还尝试在同一 Windows XP 主机上使用 VLC 播放器播放 URL。该 URL 有效,因为 VLC 可以播放它。

在我的特定情况下,http URL 由 Win 7 机器上的 WMP 12(窗口媒体播放器 12)托管,我正在使用 WMP 12 的媒体共享功能。

在进一步研究了wireshark 上的http 流量后,我发现了以下内容。

在运行 adobe AIR 应用程序的主机上运行 wireshark 后,似乎收到了 HTTP 406 响应

由 WMP 12 运行的服务器。

GET /WMPNSSv4/63903908/1_ezVGREUzQTA4LTdDQzQtNDJFMy1CNDVDLUZEMjA4MDE5OUM4Q30uMC44.mp4 HTTP/1.1
Host: 192.168.0.102:10243
User-Agent: Mozilla/5.0 (Windows; U; en) AppleWebKit/526.9+ (KHTML, like Gecko) AdobeAIR/1.5
Referer: app:/clicker.swf
x-flash-version: 10,0,12,36
Connection: Keep-Alive
Accept: text/xml, application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8, text/css, image/png, image/jpeg, image/gif;q=0.8, application/x-shockwave-flash, video/mp4;q=0.9, flv-application/octet-stream;q=0.8, video/x-flv;q=0.7, audio/mp4, application/futuresplash, */*;q=0.5

回复:

HTTP/1.1 406 Not Acceptable
Last-Modified: Mon, 19 Oct 2009 23:21:14 GMT
Server: Microsoft-HTTPAPI/2.0
Accept-Ranges: bytes
TransferMode.DLNA.ORG: Streaming
Date: Tue, 12 Jan 2010 22:52:48 GMT
Connection: close
Content-Length: 0

在 MAC 上:

但是它会收到 200 OK 响应,这就是视频流工作的原因。

GET /WMPNSSv4/63903908/1_ezVGREUzQTA4LTdDQzQtNDJFMy1CNDVDLUZEMjA4MDE5OUM4Q30uMC44.m p4 HTTP/1.1
Host: 192.168.0.102:10243
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/526.9+ (KHTML, like Gecko) AdobeAIR/1.5.3
Referer: app:/clicker.swf
X-Flash-Version: 10,0,42,34
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: keep-alive

回复:

HTTP/1.1 200 OK
Content-Length: 1524867
Content-Type: video/mp4
Last-Modified: Mon, 19 Oct 2009 23:21:14 GMT
Server: Microsoft-HTTPAPI/2.0
Accept-Ranges: bytes
TransferMode.DLNA.ORG: Streaming
Date: Tue, 12 Jan 2010 22:56:20 GMT

我可以在 Windows XP 和 MAC 版本之间的 HTTP 请求中看到的区别是 Accept: Header。Windows 情况下的 Accept: 标头值是否错误,因为 WMP 12 拒绝了 http 请求。

如果我在 Win 7 主机上运行 adobe AIR 应用程序,我会看到同样的失败。

我是否错误地使用了 NetStream 对象,或者它是 WMP 12 代码中的一个错误,无法正确解析标头,或者它是一个 flex 错误,它生成了一个不正确的接受:标头?

4

1 回答 1

0

我相信 WMP 12 错误地处理了请求中的“接受”标头。如果它包含“q”(质量)参数,则 WMP 会忽略此 mime 类型。如果没有其他适合 WMP 的 mime 类型,它将以 406 Not Acceptable 错误响应。

我在尝试在 Chrome 浏览器中显示 DLNA 图像时遇到了这个问题。

我使用curl实用程序发送具有不同标头的请求以找出问题所在。

导致 406 Not Acceptable 错误的请求:

curl -v -o file.jpg -H "Accept: text/html,*/*,q=0.8" "http://127.0.0.1:10243/WMPNSSv4/3065481158/0_e0I5MzA1MTRELUYwMEEtNEQwRC1CQzg4LTg3NEI5QjQ4MDYyM30uMC5C.jpg"

GET /WMPNSSv4/3065481158/0_e0I5MzA1MTRELUYwMEEtNEQwRC1CQzg4LTg3NEI5QjQ4MDYyM30uMC5C.jpg HTTP/1.1
User-Agent: curl/7.31.0
Host: 127.0.0.1:10243
Accept: text/html,*/*;q=0.8

HTTP/1.1 406 Not Acceptable
Last-Modified: Tue, 21 May 2013 21:01:09 GMT
Server: Microsoft-HTTPAPI/2.0
Accept-Ranges: bytes
TransferMode.DLNA.ORG: Interactive
Date: Fri, 30 Aug 2013 09:10:32 GMT
Connection: close
Content-Length: 0

请求成功:

curl -v -o file.jpg -H "Accept: text/html,*/*" "http://127.0.0.1:10243/WMPNSSv4/3065481158/0_e0I5MzA1MTRELUYwMEEtNEQwRC1CQzg4LTg3NEI5QjQ4MDYyM30uMC5C.jpg"

GET /WMPNSSv4/3065481158/0_e0I5MzA1MTRELUYwMEEtNEQwRC1CQzg4LTg3NEI5QjQ4MDYyM30uMC5C.jpg HTTP/1.1
User-Agent: curl/7.31.0
Host: 127.0.0.1:10243
Accept: text/html,*/*

HTTP/1.1 200 OK
Content-Length: 2394679
Content-Type: image/jpeg
Last-Modified: Tue, 21 May 2013 21:01:09 GMT
Server: Microsoft-HTTPAPI/2.0
Accept-Ranges: bytes
TransferMode.DLNA.ORG: Interactive
Date: Fri, 30 Aug 2013 09:10:40 GMT
于 2013-08-30T09:23:13.847 回答