flash - 从自定义 Web 服务器提供多个 flv 文件,同时保持套接字打开在第 6 个连接后停止

标签 flash http flv actionscript-3 streaming-flv-video

这让我抓狂,因为它结合了各种技术,我很难跟踪问题。

场景

我写了一个微型 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 并且刚开始流式传输。为了完整起见,这是它生成的 header :

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 内容(都在 843 端口,正如 adobe 所希望的那样)以及 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 次连接后闪光灯停止。我整整一周都在谷歌上搜索,试图找出闪存在其套接字或 NetConnections 或 NetStreams 上是否有一些最大值,但 Adob​​e 或其他任何人似乎都没有在任何地方提及这一点。

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

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

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

最佳答案

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

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

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

关于flash - 从自定义 Web 服务器提供多个 flv 文件,同时保持套接字打开在第 6 个连接后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3132715/

相关文章:

php - 如何检测 .flv 电影文件 URL?

php - 如何在 PHPUnit 中测试 PUT 请求解析

rest - Drupal7 REST : I am not able to perform POST and PUT methods. 错误是 :Not Acceptable : Node type is required, 代码 :406?

flash 播放器在尝试进入全屏模式 android 4.0 时崩溃

c# - 来自 C# - 有没有办法确定 swf 是 AVM1 还是 AVM2?

http - 如何处理 Rails 3.1 中丢失的主机 header

actionscript-3 - 我可以使用 ffmpeg 和 actionscript 将网络摄像头视频 flv 转换为 mp4 吗?

html - 在 ASP.NET MVC 网站上嵌入视频

django - 从麦克风录制音频并另存为.wav django Web应用

security - src 使用 HTTPS 的 SWF 是否安全?