1

これは私を夢中にさせており、さまざまなテクノロジーの組み合わせであるため、問題を追跡するのに苦労しています。

シナリオ

.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週間これをいじっていて、気が狂っています.

4

1 に答える 1

1

Flash が HTTP 接続を開くと、ブラウザの接続メカニズムを通過すると思います。これには、単一ホストへの同時永続接続の最大数と同時永続接続の合計数に制限があります。

about:config構成 URLに移動して「network.http」でフィルタリングすることにより、Firefox の最大接続数を増やすことで、この理論をテストできます。微調整できる「network.http.max-persistent-connections-per-server」などの設定がいくつかあるはずです。

これが制限要因であることが判明した場合は、接続にブラウザーを経由せず、Flash からサーバーに直接接続するRTMPなど、ビデオを提供する他の方法を調査することをお勧めします。

于 2010-06-29T06:26:38.807 に答える