这让我发疯了,因为它是各种技术的结合,我很难跟踪问题。
设想
我编写了一个小型 HTTP 服务器来提供 .flv 文件;这些flv文件是现场编码的。flv 文件是用 adobe 的屏幕编解码器编码的(我从 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 进行编码并开始通过打开的 tcp 连接发送该字节流。客户端(浏览器)和服务器都在本地主机上运行。服务器还将提供 crossdomain.xml 内容(在 adobe 需要的端口 843 上)以及端口 80 上。Flash 确实要求提供跨域文件,并且在文件中我允许所有内容。在 flash/CS4 中,我启用了所有允许 swf 进行网络操作的设置。
这一切都很好,除了闪光在第 6 次 flv 之后停止。如果我在发送几帧后关闭套接字,那么 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 次连接后 flash 会停止。我用谷歌搜索了一整周,试图找出 flash 在其套接字、NetConnections 或 NetStreams 上是否有最大值,但 Adobe 和其他任何人似乎都没有在任何地方提到这一点。
我发现的另一个奇怪的事情是 6 个打开的连接仅基于每个端口,所以我可以在端口 80 上打开 6 个 flv,在端口 81 上打开另外 6 个……我可能会重写我的实现以服务于不同的端口,但这会很痛苦(尤其是考虑到人们有防火墙),而且这没有任何意义。
要么我在 as3 中做错了什么,要么 flash 确实有一些我不知道且没有记录的限制,或者我的 HTTP 标头中可能存在一些问题。
有人知道可能是什么问题吗?我真的没有选择了,我已经摆弄了一个星期了,这让我发疯了!