8

問題

既存の Flex プロジェクトのmx:VideoDisplayコンポーネントをカスタムメイドのコンポーネントに置き換える必要があります。

これを実現するには、現在のインターフェイスに準拠する必要があるため、コンポーネントは次のいずれかの形式で (source パラメーターを介して) ビデオ URL を受け取ります。

  1. /data/myflvfile.flv (ファイルがローカルで再生される場合)
  2. rtmp://streamcloud.myserver.com/cfx/st/somedirectory/myflvfile.flv (ファイルが Cloudfront からストリーミングされる場合)

私の新しいコンポーネントは、NetConnection と NetStream に基づいています。上記のエントリのいずれかで、入力を 2 つの文字列に分割する必要があります。1 つは NetConnection.connect(NetConnectionStr) メソッド用で、もう 1 つは NetStream.play(NetStreamStr) メソッド用です。例えば:

  1. /data/myflvfile.flvを指定すると、次のようになります。
    • NetConnectionStr = null
    • NetStreamStr = "/data/myflvfile"
  2. rtmp://streamcloud.myserver.com/cfx/st/somedirectory/myflvfile.flv の場合:
    • NetConnectionStr = "rtmp://streamcloud.myserver.com/cfx/st"
    • NetStreamStr = "somedirectory/myflvfile"
  3. rtmp://streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flv の場合:
    • NetConnectionStr = "rtmp://streamcloud.myserver.com/cfx/st"
    • NetStreamStr = "somedirectory/subdirectory/myflvfile"

2 つの文字列を作成することは、「ローカル ファイル」の場合は非常に明白ですが、他の場合は注意が必要です。問題は、入力のどの部分がサーバー URL で、どの部分がストリーム名 + ディレクトリ構造であるかを推測するスマートな方法がないことです。

インターネットで見つかったいくつかの例では、人々はソースの最後の部分 (最後に見つかった「/」の後にある部分) が NetStream 名であると単純に推測しています。私の場合、ストリームがサーバーのサブディレクトリにある可能性があるため、これは常に当てはまるとは限りません。サーバー名には「/」文字が含まれている可能性があるため、さらに悪いことです!

それを解決するための戦略

サーバーへの接続、実際の URL の取得、ストリーム名の検索

NetConnection は十分に「賢い」ように見えるので、最初の試みは、完全なソース URL を使用して connect メソッドを呼び出すことでした。たとえば、 rtmp://streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flvを指定すると、

NetConnection は次の場合に成功します。

  • connection.connect( rtmp://streamcloud.myserver.com/cfx/st/ )
  • connection.connect( rtmp://streamcloud.myserver.com/cfx/st/somedirectory/ )
  • ...
  • connection.connect( rtmp://streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flv )

次に、サーバーの「実際の」URL ( rtmp://streamcloud.myserver.com/cfx/st )を何とか取得したいと思っていたので、ストリーム部分 ( somedirectory/subdirectory/myflvfile )を推測できます。

残念ながら、実際のサーバー アドレスを NetConnection オブジェクトから取得する方法は見つかりませんでした (connection.uri は正確な入力を返します)。したがって、これは行き止まりのようです。

サーバーに接続し、ストリームを繰り返し取得する

もう 1 つの戦略は、サーバーに接続してから (最後から開始して) ストリームを再生することを、それが機能するまで繰り返し試行することです。

rtmp://streamcloud.myserver.com/cfx/st/somedirectory/subdirectory/myflvfile.flv の場合:

  • 1 を試してください: stream.play( myflvfile ) FAIL
  • 試行 2: stream.play( subdirectory/myflvfile ) FAIL
  • 試行 3: stream.play( somedirectory/subdirectory/myflvfile ) SUCCESS

しかし、これは非常に厄介な方法であり、より良い解決策を探しています。

より良い解決策はありますか?

この問題を解決する良い方法はありますか? 元の VideoDisplay コンポーネントでそれをどのように行っているか知っている人はいますか (NetConnection/NetStream オブジェクトに基づいている場合)?

この問題に関するヘルプやコメントをお寄せいただきありがとうございます:)

4

3 に答える 3

0
var match:Array = path.match('rtmp://(.*/.*/.*/)');
var server:String = match[0];
var file:String = removeExtension(path.replace(match[1], ''));
var channel:String = removeExtension(path.replace(match[2], ''));

参照: http://onyx-vj.googlecode.com/svn/trunk/Onyx-VJ%203.0.0/OnyxCore/onyx/core/ProtocolRTMP.as

于 2011-11-28T00:08:19.617 に答える
0

実行中の rtmp サービスに対してソリューションをテストしないと、これを完全に検証することは困難ですが、2 番目のあまり望ましくない戦略を次のように改良することを検討してください。

  • 通常どおり NetConnection を作成します

  • connect() が初めて成功したとき、サービスとアセットの可能な組み合わせ ("rtmp://streamcloud.myserver.com/cfx/" & "/st/somedirectory/subdirectory/myflvfile.flv" など) を反復処理し、それぞれに対して並行 NetStreams を作成します。これにより、シーケンシャルな検出を待つ必要がなくなります。

  • NetStreams の 1 つが成功イベントをディスパッチした場合、それをディスプレイに接続し、他のすべてのものを床にドロップします (いずれにせよ失敗する可能性があります)。

  • オプションで、接続が再利用される場合に高速化するために、機能した成功したサービス/アセットのペアを保存できます

厄介な問題のようです!

于 2011-12-14T04:56:58.333 に答える