これは私を夢中にさせており、さまざまなテクノロジーの組み合わせであるため、問題を追跡するのに苦労しています。
シナリオ
.flv ファイルを提供する小さな HTTP サーバーを作成しました。これらの flv ファイルはその場でエンコードされます。flv ファイルは、adobe の screencodec でエンコードされています (libflv から始めましたが、バグが多すぎたため、独自の flv エンコーダーを実装することになりました)。以下の問題では、どのコーデックを使用するか、その場で生成されたものではなくプレーンな flv ファイルを提供するかどうかは問題ではありません (12 個の h264 エンコード ファイルを送信しただけでも問題は発生します)。as3でコーディングしたswfもあります。as3 は、サーバーへの 12 の接続を開き、12 の異なる flv を要求し、それらを 12 の異なるビデオとしてページに表示します。Firefox と chrome でセットアップをテストし、最新のフラッシュ クライアント (バージョン 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 接続を介してそのバイトストリームの送信を開始します。クライアント (ブラウザ) とサーバーの両方が localhost で実行されています。サーバーは、ポート 80 だけでなく、crossdomain.xml も提供します (アドビが必要とするポート 843 の両方で)。Flash は実際にクロスドメイン ファイルを要求し、ファイルですべてを許可します。flash/CS4 では、swf がネットワーク機能を実行できるようにするすべての設定を有効にしました。
フラッシュが 6 番目の flv の後に停止することを除いて、これはすべて正常に機能します。いくつかのフレームを送信した後にソケットを閉じると、swf は 12 個すべてを喜んで表示します。しかし、ソケットを開いたままにしておくと (サービスを提供し続けたい場合はこれがポイントです)、6 つの Netstream 接続後に終了します。したがって、サーバーに 6 つのリクエストを送信してから停止します。as3側では、あらゆる種類のことを試しました(1つの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のいずれかに最大値があるかどうかを1週間グーグルで検索しましたが、アドビも他の誰もこれについてどこにも言及していないようです。
私が見つけたもう1つの奇妙なことは、6つの開いている接続はポートごとにのみであるため、ポート80で6つのflvを開き、ポート81で別の6つのflvを開くことができるということです...おそらく実装を書き直して、異なるしかし、それは苦痛であり (特に人々がファイアウォールを持っていることを考えると)、意味がありません。
as3で何か間違ったことをしている、またはフラッシュに私が認識していない制限があり、それが文書化されていないか、HTTPヘッダーに問題がある可能性があります。
誰でも何が問題なのか手がかりを得ましたか? 私は本当にオプションを使い果たしています.1週間これをいじっていて、気が狂っています.