1

这让我发疯了,因为它是各种技术的结合,我很难跟踪问题。

设想

我编写了一个小型 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 上是否有最大值,但 Adob​​e 和其他任何人似乎都没有在任何地方提到这一点。

我发现的另一个奇怪的事情是 6 个打开的连接仅基于每个端口,所以我可以在端口 80 上打开 6 个 flv,在端口 81 上打开另外 6 个……我可能会重写我的实现以服务于不同的端口,但这会很痛苦(尤其是考虑到人们有防火墙),而且这没有任何意义。

要么我在 as3 中做错了什么,要么 flash 确实有一些我不知道且没有记录的限制,或者我的 HTTP 标头中可能存在一些问题。

有人知道可能是什么问题吗?我真的没有选择了,我已经摆弄了一个星期了,这让我发疯了!

4

1 回答 1

1

我相信当 Flash 打开一个 HTTP 连接时,它会通过浏览器的连接机制,该机制对单个主机的最大并发持久连接数以及并发持久连接总数都有限制。

您可以通过转到配置 URLabout:config并过滤“network.http”来增加 Firefox 中的最大连接数来测试这个理论。应该有一些设置,例如您可以调整的“network.http.max-persistent-connections-per-server”。

如果事实证明这是限制因素,那么您可能需要研究其他方式来提供视频,例如RTMP,它不通过浏览器进行连接,而是直接从 Flash 连接到您的服务器。

于 2010-06-29T06:26:38.807 回答