这让我疯狂,因为它是各种技术的结合,我很难跟踪问题。
方案
我写了一个小的HTTP服务器,提供.flv文件;这些flv文件是在现场编码的。 flv文件使用adobe的screencodec进行编码(我从libflv开始,但这太麻烦了,所以我最终实现了自己的flv编码器)。对于下面的问题,我使用哪个编解码器或者我提供普通的flv文件而不是现场生成的文件并不重要(如果我只发送12个h264编码的文件,也会出现问题)。我也有一个我用as3编写的swf。 as3打开12个连接到我的服务器并请求12个不同的flv,并在页面上显示为12个不同的视频。我使用Firefox和chrome测试了设置,并使用了最新的Flash客户端(版本10)。 HTTP服务器是伪流式传输这些文件;例如它告诉客户端文件是mime类型的video / x-flv,告诉文件大小是2GB并且刚开始流式传输。为了完整起见,这里是它生成的标题:
HTTP/1.1 200 OK
Content-Type: video/x-flv
Accept-Ranges: bytes
Content-Length: 2147483647
Date: Mon, 28 Jun 2010 12:53:09 GMT
Host: localhost
Keep-Alive: timeout=100000, max=100
Connection: Keep-Alive
Server: Foobar
所以会发生的事情是swf请求flv,服务器获取请求,开始编码flv并开始通过open tcp连接发送该字节流。客户端(浏览器)和服务器都在localhost上运行。服务器还将提供crossdomain.xml内容(在端口843上,如adobe想要的那样)以及端口80.Flash确实要求交叉域文件,在文件中我允许所有内容。在flash / CS4中,我启用了允许swf进行网络连接的所有设置。
除了闪光灯在第6个闪光灯后停止,这一切都正常。如果我在发送几帧之后关闭套接字,那么swf将很乐意显示所有12帧。但是如果我保持套接字打开(这是我要继续服务的全部点),它就会在六次Netstream连接后退出。因此,它会向服务器发送6个请求,然后停止。在as3方面,我尝试了所有类型的东西(使用一个NetConnection,调整一下这个时间),但似乎没有任何帮助。
as3代码如下所示:
var connection = new NetConnection();
connection.connect(null);
var stream = new NetStream(connection);
var listener:Object = new Object();
listener.onMetaData = onMetaData;
listener.onCuePoint = onCuePoint;
// stream.checkPolicyFile=true;
stream.client = listener;
stream.bufferTime = 0;
var video = new Video(640,480);
video.attachNetStream(stream);
// connection.maxPeerConnections = 32;
stream.play("http://localhost:80/" + n +".flv");
我将这段代码循环12次以生成请求。
所以给出了什么;为什么闪光灯在第6次连接后停止。我整整一周都试图找出闪存在其套接字或NetConnections或NetStreams上是否有一些最大值,但是Adobe和其他任何人似乎都没有在任何地方提到它。
我发现的另一个奇怪的事情是6个开放连接只是基于每个端口,所以我可以在端口80上打开6个flv,在端口81上打开另外6个...我可能会将我的实现重写为服务于不同的端口,但这将是一个痛苦(特别是考虑到人们有防火墙),它只是没有意义。
要么我在as3中做错了,要么flash确实有一些我不知道的限制,而且没有记录,或者我的HTTP头中可能存在一些问题。
任何人都知道可能是什么问题?我真的没有选择了,我现在已经习惯了一个星期了,这让我疯了!
答案 0 :(得分:1)
我相信当Flash打开HTTP连接时,它会通过浏览器的连接机制,该机制限制了与单个主机的最大并发持久连接数,以及总并发持久连接数。
您可以通过转到配置网址about:config
并过滤“network.http”来增加Firefox中的最大连接数来测试此理论。应该有一些设置,例如你可以调整的“network.http.max-persistent-connections-per-server”。
如果这是限制因素,那么您可能需要研究其他方式来为您的视频提供服务,例如RTMP不通过浏览器进行连接,而是直接从Flash连接到你的服务器。