我正在使用 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 错误,它生成了一个不正确的接受:标头?