ADOBE®   MEDIA SERVER 5.0.3

デベロッパーズガイド


翻訳:株式会社サムライズ

 

注意

Adobe Media Server® バージョン 5についての本ドキュメントは第三者によって翻訳されたものであり、Adobe Systems Incorporated(アドビ システムズ社)は本翻訳物の正確性や完全性を査閲していません。

 

RTMFP グループ

FlashPlayer 10.1AIR 2Flash Media Server 4

 

Flash Player 10.1AIR 2 および Flash Media Server 4 RTMFP グループをサポートしています。クライアントは、Adobe Media Server に対して RTMFP 接続を行い、グループに参加します。

ピア  グループのメンバー ( 別称「ノード」)。ピアは、Flash Player または AIR のクライアントで、RTMFP 上で Adobe Media Server に対して接続を行い、グループに参加します。

グループ  グループは、特定のパラメーターと機能について合意した、1つ以上の RTMFPノードの集まりです。ピアツーピアメッシュを形成するグループ内のすべてのピア間にパスがあります。2つのピアの間に直接接続がない場合もありますが他のピアを介してパスは必ずありますグループは「ピアグループRTMFPグループNetGroupとも呼ばれます。

ブートストラップ  グループの一員になるために少なくともあるグループの 1 メンバーに接続することクライアントをグループにブートストラップするようにアプリケーションロジックを書き込んだり、クライアントを自動的にブートストラップするように Adobe Media Serverに求めることができますピアに関するランダムな検査はありませんまたサーバーはピアを探しているネットワークをフラッドしません。

Adobe Media Server グループへのクライアントの紹介を処理しますFlash Player 遅延対策にグループの編成や最適化を行い、グループの完全なつながりを維持しながら、グループ内のピア通信を処理します。

グループは、ピア間の接続を自動的に維持します。ピアがグループ内で完全にメッシュを構成している場合、各ピアはグループ内でデータを渡すことができます。各クライアントにデータを配信するために、データをサーバーに送信する必要はありませんピアはオーディオビデオActionScriptオブジェクトなどのデータを共有できますRTMFPとグループを使用することで、数百万台のクライアントで構成されるピアツーピアアプリケーションを構築できます。

groupspec」と呼ばれる文字列でグループのパラメーターと機能を定義するには、ActionScript 3.0 GroupSpecifier クラスを使用します。groupspec は、NetGroup および NetStream コンストラクターに渡します。グループを管理しグループ内でActionScript データを送信するには、NetGroup クラスを使用します。グループ内でオーディオとビデオをマルチキャストするには、NetStream クラスを使用します。

groupspecsG:01010b...」のようにG:」で始まり、16進数の桁が続く文字列です。文字列の最初の部分は、グループの変更不可能な IDであり、グループの権限が含まれています。ピアがグループの権限またはプロパティを変更すると、新しいグループが開始されます。文字列では大文字小文字が区別されます。

 

グループでは、次の操作を行えます。

•   マルチキャスティング

マルチキャスティングは、1 人または数人の送信者がグループ内の全員にデータストリームを配信するために使用します。

•   グループへのメッセージの送信」ポスティングは、多数の送信者がグループ内の全員に少量のデータを配信するために使用します。

•   ピアへ直接のメッセージのルーティング

直接ルーティングは、オーバーレイルーティング構造を介して 1 人のピアにメッセージを送信するために使用します。

•   グループ内のオブジェクトの複製

オブジェクトレプリケーションは、多数の (大量になる可能性のある )オブジェクトでグループ内の全員を同期するために使用します。

ストリームをマルチキャストしたりメッセージを送信したりするには、ActionScriptメソッドを呼び出して送信データを渡します。データはグループ内のその他のノードに到達します。

メッセージをピアに直接ルーティングして、オブジェクトをグループ内で複製するには、ActionScriptコードを記述してデータの配信を図る必要があります。

 

 

グループの作成

1   Adobe Media Server に接続しますrtmfpURL NetConnection.connect() メソッドに渡します。

 

NetConnection.connect("rtmfp://ams.example.com/p2pexample/test1")

 

Adaptor.xmlファイルで RTMFPを無効にした場合クライアントが「NetConnection.Connect.Failedステータスを受信するまで最大2分かかる可能性があります。この遅延を防ぐには<RTMFP enable="true">Adpator.xml ファイルにあることを確認します。これはデフォルトで有効になっています。

2   "NetConnection.Connect.Success" で、GroupSpecifier クラスを使用して groupspecを作成します。groupspec NetGroup コンストラクターに渡します。

 

// Called in the "NetConnection.Connect.Success" case in the NetStatusEvent handler.

private function OnConnect():void{

connected = true;

// Create a GroupSpecifier object to pass to the NetGroup constructor.

// The GroupSpecifier determines the properties of the group

var groupSpecifier:GroupSpecifier;

groupSpecifier = new GroupSpecifier("com.example.p2papp");

groupSpecifier.postingEnabled = true;

groupSpecifier.multicastEnabled = true;

// The serverChannel lets the server do auto-bootstrapping

groupSpecifier.serverChannelEnabled = true;

netGroup = new NetGroup(netConnection, groupSpecifier.groupspecWithAuthorizations());

netGroup.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);

}

 

3   "NetGroup.Connect.Success" で、手動または自動でピアをグループにブートストラップします。例では、サーバーチャネルを有効にして、自動的なブートストラップを実行しています。ブートストラップのためのいくつかの追加のオプションについて、次の節で説明します。

 

補足情報

Tom Krcha GroupSpecifier クラスに関する詳細な記事を、ブログ Flash Realtime に書いています。

 

グループへのピアのブートストラップ

ピアがサーバーに最初に接続した後、ピアを同じグループの 1 つ以上のピアに紹介する必要があります。この手法は「ブートストラップ」と呼ばれます。ブートストラップにより、同じグループのメンバーが互いを認識できるようになります。

ブートストラップの後、ピアは自身をグループに組み込み、他のメンバーとメッシュを構成します。

 

グループに参加するには、クライアントはそのグループを定義する GroupSpecifierを知っている必要があります。2セットのクライアントが同じGroupSpecifierを使用しかつタッチすることがない場合は別々のグループになりますこの 2 つのグループがタッチする場合は、マージされて単一のグループとして大きくなります。

ピアごとにピア ID がありピア ID スペースはサーバー固有ですピア ID クライアントの Diffie-Hellman 公開鍵の SHA256 です。クライアントサイドおよびサーバーサイドの ActionScript は、各 RTMFP クライアントのプロパティとしてピア ID にアクセスすることができます。ピア ID は、ActionScript 3.0 NetConnection.nearID および NetConnection.farIDのプロパティで使用可能です。また、ピア ID は、サーバーサイド ActionScript Client.nearID および farID のプロパティで使用可能ですクライアントサイド NetConnection.nearID とサーバーサイド Client.farID は同じ値を共有します。クライアントサイド NetConnection.farID とサーバーサイド Client.nearID は同じ値を共有します。

RTMFPグループ内のピアは、次の方法でブートストラップできます。

•   サーバーチャネルの自動的なブートストラップ。

クライアントが RTMFP接続を使用して接続すると、サーバーは同じ NetGroupのメンバーであるピアにブートストラップします。クライアントサイドで自動的なブートストラップを有効にするには、 GroupSpecifier.serverChannelEnabled  true  に設定します。

•   手動ブートストラップ。

ピアをメッシュに手動でブートストラップするにはNetGroup.addNeighbor()   メソッドを呼び出します。

•   LAN ピアの検出

LAN ピアの検出を有効にするには、GroupSpecifier クラスを使用します。LAN ピアの検出によりRTMFP NetConnection とその NetStream および NetGroup オブジェクトはピアを自動的に検出して現在のサブネット上のグループに参加できますLAN の同じサブネット上の同じグループにいないピアは互いを検出できませんgroupspecs が一致する複数のピアが異なるサブネット上にある場合、互いを検出できなくても、エラーまたはその他のイベントはディスパッチされません。

次のコードに、LANピア検出を有効にする方法を示します。

 

var nc = new NetConnection();

// Protocol must be RTMFP

nc.connect("rtmfp://ams.example.com/appname/appinstance");

var gs = new GroupSpecifier("com.example.discovery-test");

// Must be enabled for LAN peer discovery to work

gs.ipMulticastMemberUpdatesEnabled = true;

// Multicast address over which to exchange peer discovery.

gs.addIPMulticastAddress("224.0.0.255:30000");

// Additional GroupSpecifier configuration...

var ns = new NetStream(nc, gs.toString());

注意RTMFP ピア参照統計を取得するには、Administration API getServerStats() コマンドを呼び出します。更なる情報は、getServerStats()を参照してください。

 

サーバーサイド RTMFPグループ

RTMFP NetConnection を作成するにはサーバーサイド ActionScript を使用します同じサーバー上のアプリケーションまたは別の Adobe Media Server 上のアプリケーションに接続できます。RTMFP NetConnection を作成した後、GroupSpecifier を定義して NetGroup NetStream を作成します。サーバーアプリケーションはグループに参加し、グループメッシュのピアになります。単一のクライアントが複数のグループに参加することができます。接続されると、RTMFP グループ内の他のピアとのやり取りができます。また、ストリームをグループにパブリッシュすることができます。

サーバーサイド netConnection は仮想 Flash クライアントです。これは独自の RTMFP スタックを持ちます。サーバーに関する限り、グループに参加するサーバーサイドスクリプトは、クライアントのものと同じです。

注意サーバーサイドActionScript では、直接的なピア間での接続の作成はサポートされません。

 

Flash Playerピアアシストネットワーキングセキュリティダイアログ

NetStream または NetGroup オブジェクトが groupspec を使用して構築されている場合、ピアアシストネットワークダイアログが表示されます。ダイアログでは、Flash Player がその接続を使用してそのピアとデータを共有してもかまわないかどうかが質問されます。

 

ユーザーが「このドメインでの使用を許可する」をクリックすると、次回ユーザーがこのアプリケーションに接続するときにこのダイアログは表示されません。ピアアシストネットワーキングを許可しなかった場合、グループ内のピア機能(ポスティング、直接ルーティング、オブジェクトレプリケーションおよびマルチキャスト)はすべて無効になります。RTMFP を使用して純粋なネイティブ IPマルチキャストストリームにサブスクライブできますこの場合ダイアログは表示されません。

ピアアシスト機能なしで IP マルチキャストを使用するときは、セキュリティダイアログを無効にすることができます。GroupSpecifier.peerToPeerDisabled プロパティをtrue に設定しますデフォルトではこのプロパティは false ( ピアアシスト接続が有効 ) ですpeerToPeerDisabled true のとき、セキュリティダイアログは表示されません。

 

 

RTMFP グループを操作するための ActionScript クラス

RTMFP グループを使用するアプリケーションを作成するには、次の ActionScript 3.0 クラスとサーバーサイド ActionScript クラスを使用します。

    NetConnection

Flash Player または AIR アプリケーションと Adobe Media Server アプリケーションの間で双方向 RTMFP 接続を作成するにはNetConnection クラスを使用しますNetConnection.connect() メソッドに渡す URL 中で RTMFP プロトコルを使用します。

    GroupSpecifier

RTMFP ピアツーピアグループの機能、制限事項、権限を定義するには、GroupSpecifier クラスを使用します。機能を定義したらgroupspec 文字列または GroupSpecifier オブジェクトを NetStream および NetGroup コンストラクターに渡しますgroupspec は、NetStream および NetGroup コンストラクターに渡す内部文字列です。

サーバーサイドコードでは、GroupSpecifier オブジェクトまたは groupspec文字列を渡せます。クライアントサイドコードではgroupspec文字列のみを渡せますgroupspec文字列を生成するには次のメソッドのいずれかを呼び出します

toString()groupSpecWithAuthorizations()、および groupSpecWithoutAuthorizations()

    NetGroup

RTMFP グループを管理するには、NetGroup クラスを使用します。クラスプロパティは、グループメンバーに関する情報を提供します。グループへのメッセージの送信、グループメンバーへのメッセージのルーティング、グループ間でのオブジェクトの複製を行うには、クラスメソッドを呼び出します。NetGroup を作成するには、GroupSpecifier オブジェクトをNetGroup コンストラクターに渡します。

    NetGroupInfo

NetGroupInfo クラスは、NetGroup オブジェクトのRTMFP ピアツーピアデータ転送に関するサービス品質(QoS)を指定しますNetGroup.info プロパティは、NetGroupInfo オブジェクトを返します。これは現在の QoS 状態です。

    NetStream

グループ内でオーディオとビデオをマルチキャストするには、NetStream クラスを使用します。groupspec NetStream コンストラクターに渡し、標準の publish() メソッドおよび play() メソッドを使用します。

    NetStreamMulticastInfo

NetStreamMulticastInfo クラスは、NetStream オブジェクトの RTMFP ピアツーピアおよび IP マルチキャストストリーム転送に関するサービス品質(QoS)を指定しますNetStream.multicastInfo プロパティは、 NetStreamMulticastInfo オブジェクトを返します。これは現在の QoS 状態です。

 

 

グループへのメッセージの送信

Flash Player 10.1AIR 2Flash Media Server 4

 

ActionScript メッセージを NetGroup のすべてのメンバー「グループ」とも呼ばれます)にブロードキャストするには、 NetGroup.post() メソッドを呼び出します。ポストを受信したときに何かを実行するには"NetGroup.Posting.Notify" コードを使用します。

クライアントサイド ActionScript 3.0 NetGroup.post() メソッドからの、またはサーバーサイド ActionScriptNetGroup.post() メソッドからのグループにメッセージを送信できます。

非ステートフルデータをブロードキャストするにはpost()メソッドを使用します。例えば、テキストチャット、世論調査、センサーレポートなどのためにポスティングを使用します。多数のクライアントに少量のデータの送信を許可するには、ポスティングを使用します。

この方法はサーバーサイドActionScript Application.broadcastMsg() メソッドに似ていますがpost() メソッドではグループ内のノードからノードにメッセージが送信されます。ポスティングは、共有オブジェクトの使用とは似ていません。共有オブジェクトと異なり、ポスティングでは変更が管理されません。

メッセージの送信に関する次の点について理解してください。

 

    NetGroupコンストラクターに渡される groupspec内でGroupSpecifier.postingEnabledプロパティが trueに設定されている必要があります。

    post()  を呼び出す前にNetGroup.Neighbor.Connect  イベントを受信します。

•   メッセージは AMFでシリアル化されます。メッセージは任意の AMFオブジェクトでかまいません。メッセージはMovieClipにはできません。

•   メッセージが新しいものと見なされるには、一意である必要があります。シーケンス番号を使用して、メッセージを一意にします。

•   メッセージの配信は順序付けられません。メッセージの配信は保証されません。

•    post() メソッドはこのメッセージの messageID を返します。エラーの場合は null を返します。messageID はメッセージを直列化した raw バイトの 16 進数の SHA256 です。

    post() メソッドは NetStatusEvent info.codeプロパティの NetGroup.Posting.Notify NetGroup のイベントリスナーに送信します。

ActionScript 3.0 リファレンスガイド』の「NetGroup.post()」のエントリには、チャットアプリケーションの例が記載されています。次の例はその抜粋です。

 

private function OnConnect():void{

StatusMessage("Connected\n");

connected = true;

// Create a GroupSpecifier object to pass to the NetGroup constructor.

// The GroupSpecifier determines the properties of the group

var groupSpecifier:GroupSpecifier;

groupSpecifier = new GroupSpecifier("com.aslrexample/" + groupNameText.text);

groupSpecifier.postingEnabled = true;

groupSpecifier.serverChannelEnabled = true;

netGroup = new NetGroup(netConnection, groupSpecifier.groupspecWithAuthorizations());

netGroup.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);

StatusMessage("Join \"" + groupSpecifier.groupspecWithAuthorizations() + "\"\n");

}

// Called when you the chatText field has focus and you press Enter.

private function DoPost(e:ComponentEvent):void{

if(joinedGroup){

// Build the message to post.

var message:Object = new Object;

message.user = userNameText.text;

message.text = chatText.text;

message.sequence = sequenceNumber++;

message.sender = netConnection.nearID;

// Post the message to the group.

netGroup.post(message);

StatusMessage("==> " + chatText.text + "\n")

} else {

StatusMessage("Click Connect before sending a chat message");

}

ClearChatText();

}

 

 

ピアへ直接のメッセージのルーティング

クライアントは、ピアツーピアグループのメンバーに直接接続されていなくても、短い ActionScriptメッセージをメンバーに直接送信できます。この機能は直接ルーティングと呼ばれます。直接ルーティングでは、グループの自己組織化構造が持つ、変化する接続と幾何学的な特性を利用し、グループ内でメッセージをルーティングします。

 

直接ルーティングは、特定のクライアントにメッセージを送信するか、分散ハッシュテーブル(DHT)を構築するために使用します。

メッセージを正常にルーティングするには、送信元と意図する受信者の間の動的なパスに沿って、すべてのピアが直接参加していることが必要です。各ピアは、メッセージの中継ポイントとして動作します。ピアは、受信したメッセージを自動的に中継しません。受信とローカル処理またはメッセージの転送を処理するには、ActionScriptを使用します。メッセージの配信は保証されません。

メッセージルーティングの帯域幅に対する負荷は、グループのメンバーに分散され、サーバーに集中しません。

アドビシステムズ社の伝道者Tom Krcha が自分の Flash Realtime ブログの記事 Directed routing explained で直接ルーティングについて説明しています。

サーバーサイド ActionScript 直接ルーティング API を次に示します。

    NetGroup.sendToAllNeighbors()

    NetGroup.sendToNearest()

    NetGroup.sendToNeighbor()

クライアントサイド ActionScript 3.0 直接ルーティングAPI を次に示します。

    NetGroup.sendToAllNeighbors()

    NetGroup.sendToNearest()

    NetGroup.sendToNeighbor()

 

 

グループ内のオブジェクトの複製

クライアントは、高い信頼性でピアグループを通じて ActionScriptオブジェクトを送信できます。この機能はオブジェクトレプリケーションと呼ばれます。オブジェクトレプリケーションを使用すると、RTMFPグループのすべてのメンバーが、オブジェクトセットの一貫したビューを持つことができます。この機能は、ワークスペースの複製、ホワイトボードの作成、ファイルの転送、ノードでの操作ログの同期などのために使用できます。

 

オブジェクトレプリケーションは、グループの自己組織化構造が持つ、変化する接続を利用します。オブジェクトを保持しているノードから、オブジェクトが必要なノードへ、グループ内でオブジェクトが複製されます。各オブジェクトは、グループ全体で一意の番号でインデックス付けされます。オブジェクトは不変であることが必要です。

サンプルアプリケーションを始めとする、オブジェクトレプリケーションの詳細な説明については、アドビシステムズ社の伝道者Tom Krcha のブログポスFile Sharing over P2P in Flash Player 10.1 with Object Replication」を参照してください。

グループ内でオブジェクトを複製するには、次のクライアントサイド ActionScript 3.0 API を使用します。

    NetGroup.addHaveObjects()

    NetGroup.addWantObjects()

    NetGroup.denyRequestedObject()

    NetGroup.removeHaveObjects()

    NetGroup.removeWantObjects()

    NetGroup.writeRequestedObject()

 

オブジェクトレプリケーションとその他の RTMFP グループ機能には、次のサーバーサイド ActionScript API を使用します。

    ByteArray クラス

    File.readBytes()

    File.writeBytes()

 

 

マルチキャスティング

Flash Player 10.1AIR 2Flash Media Server 4

 

マルチキャスティングの詳細を学習する前にチュートリアルを完了するには、「メディアのマルチキャストRTMFP」を参照してください。

マルチキャスティングは、オーディオおよびビデオデータを、グループのメンバー間で配信します。サーバーはデータを各クライアントに送信しません。データはピア間で配信されます。マルチキャスティングにより、少ないパブリッシュ元が大量のデータを送信できます。メディアをマルチキャストするには、groupspec NetStream コンストラクターに渡します。マルチキャストデータに対しNetStream.publish() または NetStream.play() を呼び出しますデータをマルチキャストするには、クライアントサイド NetStream クラスとサーバーサイド NetStream クラスを使用できます。

Adobe Media Serverは、アプリケーションレベルのマルチキャストと IPマルチキャストをサポートしています。また、1 つのストリームでアプリケーションレベルのマルチキャストと IPマルチキャストを一体として使用できますこの使用方法はマルチキャストフュージョンと呼ばれます。マルチキャストフュージョンは、両方のブロードキャスト手法を使用して、高いサービス品質をサポートします。ファイアウォールの内部では、IPマルチキャストを使用します。ファイアウォールの外部や、IPマルチキャストをサポートしていないネットワークでは、アプリケーションレベルのマルチキャストを使用します。マルチキャストフュージョンでは、IPマルチキャスト経由では受信できないビデオフラグメントをファイアウォールの外部にある近隣ノードに受信させることができます。

 

Adobe Media Server は、RTMP 接続上で配信されたストリームをマルチキャストできます。例えば、Flash Media Live Encoder RTMP 上で Adobe Media Server にストリームを配信しAdobe Media Server RTMFP 上でグループにそのストリームをマルチキャストできます。

マルチキャストに関する次の点について理解してください。

 

•   1 つのグループで任意の数のストリームをパブリッシュできます。しかし、この方法では、その特定のクライアントでストリームが再生中でなくても各グループメンバーがすべてのストリームを消費および中継するため、お勧めできません。

•   同じ名前のストリームをグループ内にパブリッシュできます。

クライアントがストリーム名の再生を要求すると、その名前 (検索できる )の付いた最初のストリームが再生されます。名前付きのストリームのそのインスタンスのパブリッシュ元が停止した場合、再生クライアントは名前付きのストリームの別のインスタンスにリセットしNetStream.MulticastStream.Resetイベントがディスパッチされます。RTMFPグループ内には、複数のクライアントが同じ名前の付いたストリームをパブリッシュできないようにするための、ストリームの状態の単一の決定者はいません。(従来のユニキャストストリームパブリッシュではAdobe Media Serverはストリームの状態に対処します。)マルチキャストストリームのスケーラビリティの向上には重要な理由があります。ただし、ストリーム名の衝突やハイジャックから保護するには、グループに対するパブリッシュパスワードを定義して、 groupspecに信頼できるパブリッシュ元への権限のみを承認します。競合するストリームを同じ名前でパブリッシュできないようにするには、権限の承認なしに他のすべてのクライアントに groupspecを渡します。

•    パブリッシュ元は NetStream.send()を呼び出して、データをグループに組み込むことができます。

•   ライブマルチキャストストリームが再生されている RTMFPグループにクライアントがあるとき、このクライアントは、ある程度の数の直接近隣ノードに対して、当該ストリームの中継ポイントとして動作する可能性があります。この数を制御するにはNetStream.multicastPushNeighborLimit」プロパティを使用します。デフォルト値は  4 です。グループ内のピアはすべて、ストリームを取得するためにお互いに一体として協力します。各クライアントがストリームをサーバーから個別に取り込むことはありません。したがって、パブリッシュするマルチキャストストリームのビットレートの選択時に、平均的クライアントアップリンク容量を想定してみます。高すぎるビットレートを選択すると、ピアがストリームをスムーズに中継できなくなる可能性があります。

注意この要件は、P2Pマルチキャストに固有のものです。P2Pマルチキャストと同時に使用できる、IPマルチキャストは、ローカルエリアネットワーク内の高めのビットレートにもライブマルチキャストストリームにも使用できます。

 

補足情報

Multicast explained in Flash Player 10.1Tom Krcha Flash Realtimeブログの記事。

 

アプリケーションレベルのマルチキャスト

デフォルトでは、ピアツーピアメッシュは、RTMFPグループにパブリッシュされたストリームを配信します。この技術は「アプリケーションレベルマルチキャスト」と呼ばれます。

 

IP マルチキャスト

IPマルチキャストでは、ルーターを使用して、指定された IPアドレスにデータを送信します。ルーターは、IPマルチキャストグループに登録されているすべてのクライアントにデータを送信します。IPマルチキャストを設定するには、IT部門と協力して作業します。パブリッシュ先のアドレスを設定し、トラフィックを適切に転送するように企業のマルチキャストルーターを設定するよう依頼します。

ストリームを IPマルチキャストアドレスにパブリッシュするには、パブリッシュを開始する前に、サーバーサイドActionScriptNetStream.setIPMulticastPublishAddress() メソッドを呼び出します。

グループ内のサブスクライブしている ( 再生中の ) ピアは、IP マルチキャストアドレスを、自身の GroupSpecifier に追加する必要があります。groupspec を作成するときにGroupSpecifier.addIPMulticastAddress() を呼び出します。IP マルチキャストアドレスを追加することで、クライアントは、IP マルチキャストトラフィックをリッスンして受信できるようになります。

デフォルトでは、アプリケーションレベルのマルチキャストは、IPマルチキャストと同時に動作します。この技術は「フュージョンマルチキャスト」と呼ばれます。アプリケーションレベルマルチキャストを使用せずに IPマルチキャストを実行するには、GroupSpecifierで次のように設定します。

     GroupSpecifier.peerToPeerDisabled=true

この設定により、ピアツーピアマルチキャストが無効になります。

     GroupSpecifier.multicastEnabled=true

     GroupSpecifier.addIPMulticastAddress()     を呼び出します。

このメソッドは、クライアントサイドのアプリケーションだけで呼び出します。サーバーからパブリッシュするには、ストリームはサーバーサイド ActionScript NetStream.setIPMulticastPublishAddress() メソッドに渡したアドレスにストリームをパブリッシュします。そのアドレスは、クライアントが使用しているアドレスと同じです。

 

ソース特定 IP マルチキャスト

Flash Media Server 4.5

 

Source-specific multicastSSM)を使用すると、クライアントがデータを受信する IP アドレスを指定できるようになります。クライアントはこのソースからのみデータを受信します。SSM により、ネットワークの負荷が減少します。SSM を設定するには、rootinstall/tools/multicast/configurator にインストールされているマルチキャストコンフィグツールを使用してください。チュートリアルメディアのマルチキャスト(RTMFP」では、マルチキャストコンフィグツールを使用します。

Source-Specific Multicastは、IP マルチキャストデータの受信を「ソース」から送信されるデータに制限します。マルチホームシステム(複数の IP アドレスを持つシステム)では、サーバーサイドのパブリッシュ元が次の API を使用して必要なローカルインターフェイス IP アドレスにバインドできます。

 

netConn.rtmfpBindAddresses = ["10.58.117.135"];

受信者側では、IP マルチキャストアドレスを GroupSpecifier に追加したときに、必要なソースアドレスを示します。

 

gs.addIPMulticastAddress("{mcastAddr}", {port}, "10.58.117.135");

 

すべてのホストオペレーティングシステムが SSMをサポートしているわけではありません(例えば、Lion以前の Mac OS。オペレーティングシステムがSSLをサポートしていない場合、クライアントはデータを受信しません。

 

クライアントサイドのサーバーレス RTMFP 接続の作成

Flash Media Server 4.0

 

サーバーに接続せずに、RTMFPグループと IPマルチキャスト通信向けのネットワークエンドポイントを作成できますが、機能は制限されます。このモードは「サーバーレスモード」と呼ばれます。サーバーへの接続やピアツーピアメッシュへのブートストラップをクライアントに要求せずに、パブリッシュ元から純粋な IPマルチキャストストリームを受信するには、サーバーレスモードを使用します。

サーバーサイド ActionScriptではサーバーレスモードを使用して堅牢なサーバーのみのグループを作成しピア紹介を配信します。「サーバー間のピア紹介の配信」を参照してください。

クライアントはサーバーに接続しないため、自動的なブートストラップはありません。サーバーレスモードでは、IPマルチキャストを使用して LAN上でお互いを検出するようにピアを設定します。ピアはお互いを検出すると、グループ内で通信できます。サーバーレスモードで、クライアントは次を行うことができます。

•   IP マルチキャストを使用して、LAN 上のピアを検出します。

•   IP マルチキャストを経由してストリームを受信します。

•    NetGroup 内のストリームを送受信します(NetGroup LAN 上で IP マルチキャストを経由して検出されたピアのみで構成されます。)

次のコードでは、接続がサーバーレスモードで作成されます。

 

var nc:NetConnection = new NetConnection;

nc.connect("rtmfp:");

NetConnection インスタンス nc は、サーバーレス RTMFP NetConnection です。次のコードでは、NetConnection を使用して、純粋な IP マルチキャストを受信できる NetStream を作成します。また、ピアアシストネットワーキング権限ダイアログを非表示にもします

 

var gs:GroupSpecifier = new GroupSpecifier("com.adobe.pureIPMulticastGroup");

gs.multicastEnabled = true;

// Prevents the P2P permission dialog from appearing.

gs.peerToPeerDisabled = true;

// Receive multicast stream on 239.255.255.1 port 30000

gs.addIPMulticastAddress("239.255.255.1:30000");

var ns:NetStream = new NetStream(nc, gs.groupspecWithAuthorizations());

 

NetStream.Connect.Success」メッセージの表示を待ちます。グループ NetStreamを使用するには、その前にこのメッセージが表示される必要があります。NetStreamをビデオ表示オブジェクトに割り当てns.play(streamName) を呼び出します。または、以下のように、RTMFPグループモードのいずれか向けに LAN上にグループを作成できます (ピアツーピアマルチキャストを含む )

 

var gs:GroupSpecifier = new GroupSpecifier("com.adobe.myAdHocGroup");

gs.multicastEnabled = true;

gs.postingEnabled = true;

gs.ipMulticastMemberUpdatesEnabled = true;

// Peers find each other on 239.255.255.11 port 30001

gs.addIPMulticastAddress("239.255.255.11:30001");

var ns:NetStream = new NetStream(nc, gs.groupspecWithAuthorizations());

var ng:NetGroup = new NetGroup(nc, gs.groupspecWithAuthorizations());

NetStream.Connect.Success NetGroup.Connect.Success が表示されるまで待ちます上記を受信したらNetStream 上でピアツーピアマルチキャストストリームをパブリッシュまたは再生し、NetGroup 上で送信できます。

 

アドビ システムズ社の伝道者 Tom Krcha のビデオチュートリアルControlling the desktop with your mobile device via P2P」を参照してください。

 

フュージョンマルチキャスト

デフォルトでは、IPマルチキャストを実行すると、アプリケーションレベルのマルチキャストも実行されます。この手法は「フュージョンマルチキャスト」と呼ばれます。IPマルチキャストとアプリケーションレベルマルチキャストは、調和して同時に動作します。IPマルチキャストの高い効率を活用するため、アプリケーションレベルマルチキャストは、IPマルチキャストよりも若干後で動作します。

 

マルチキャストサービス品質のチェック

クライアントがマルチキャスティングしているかどうかを確認し、サービス品質を確認するには、ActionScript 3.0 NetStream.multicastInfo プロパティを使用します。このプロパティは、マルチキャスティング時に統計のさまざまなQoS 基準を指定するNetStreamMulticastInfo クラスのインスタンスです。例えば、NetStreamMulticastInfo.bytesReceivedFromIPMulticast プロパティは純粋な IP マルチキャストを介してクライアントが受信している多くのデータを示します ( アプリケーションレベルマルチキャストに対して )

サーバーサイド ActionScript リファレンスガイドではNetStreamMulticastInfo クラスと MulticastStreamIngest クラスを使用します。

 

サーバーによるアプリケーションのアンロードの防止

Adobe Media Server は、着信接続のないアプリケーションをアイドルと見なします。その結果、サーバーはアプリケーションをアンロードします。サーバーがアプリケーションをアンロードしないようにするにはfalse を返すApplication.onAppStop() ハンドラーを定義します。

例えばサーバー Aとサーバー B2台の Adobe Media Serverがある次のシナリオを考えますサーバー Aピア紹介者として機能しライブストリームを取り込みますサーバー B上のアプリケーションはサーバー Aからストリームを受信しStream.play()を呼び出して、RTMFPグループにストリームをパブリッシュします。サーバー B上のアプリケーションには、サーバー Aへの発信接続がありますが、着信クライアント接続はありません。アプリケーションに外部からのクライアント接続がない場合、サーバーは、このアプリケーションをアイドル状態であると見なしてアンロードします。

 

マルチキャストストリームの取り込み、変換および記録

Flash Media Server 4.5

 

サーバーサイド ActionScriptを使用して、マルチキャスト RTMFPストリームを取り込みます。サーバーがマルチキャストストリームを取り込んだら、スクリプトを記述して次の操作を行います。

•   マルチキャストストリームを Stream オブジェクトに変換します。

•   Stream HTTP 経由でクライアントに配信します。

livepkgr アプリケーションに接続し、HTTP Dynamic Streaming HTTP Live Streaming を使用した配信のためにStream をパッケージ化します。

•    RTMP/T/S/E を使用して Stream オブジェクトをクライアントに配信します。

•   Stream オブジェクトを記録します。

マルチキャストの取り込みを使用して、サーバー層でライブコンテンツを配信します。

 

注意RTMFP マルチキャストストリームを別の RTMFP グループに直接ブリッジすること(Stream をマルチキャスト NetStream に割り当てることにより)はできません。MulticastStreamIngest createdStream に割り当てられている NetStream を経由してターゲットグループへパブリッシュすることにより、別の RTMFP グループに間接的にブリッジすることができます。

マルチキャストストリームを取り込む API

    MulticastStreamIngest クラス

MulticastStreamIngestクラスを使用して、グループ内のマルチキャストストリームにバインドし、マルチキャストメッセージを非マルチキャストメッセージに変換します。このクラスを使用して、QoS 情報にアクセスし、取り込みを制御します。

    MulticastStreamIngest.close()

ソースマルチキャストストリームの取り込みを停止します。

    MulticastStreamIngest.ingesting

ターゲットマルチキャストストリームがバインドされて取り込まれているかどうかを示します。

    MulticastStreamIngest.multicastInfo

プロパティにサービスのストリームの質に関する統計情報が含まれる MulticastStreamInfo オブジェクト。

    MulticastStreamIngest.multicastPushNeighborLimit

マルチキャストメディアを移動するピアの最大数。

    MulticastStreamIngest.multicastWindowDuration

ピアツーピアマルチキャスト再構築ウィンドウの継続時間(秒単位

    NetGroup.getMulticastStreamIngest("livestream")

NetGroupが参加しているグループにパブリッシュされる指定のストリームにバインドされる、MulticastStreamIngestオブジェクトを構築して戻すファクトリメソッド。

    Stream.playFromGroup(ingest)

 

Stream オブジェクトのデータソースを設定しますingest パラメーターは、グループからマルチキャストストリームを取り込む MulticastStreamIngest オブジェクトです。

MulticastStreamIngest API の使用

MulticastStreamIngest インスタンスを作成し、ライブストリームを取り込むにはNetGroup.getMulticastStreamIngest()  呼び出します。取り込まれたストリームを再生するにはStream.playFromGroup() を呼び出します。MulticastStreamIngest クラスを使用して、QoS とパブリッシュのステータスをチェックし、ストリームの取り込みを停止し取り込み設定を構成しますこれらの API の詳細についてはサーバーサイド ActionScript リファレンスガイド」を参照してください。


マルチキャストの取り込みアプリケーションフロー

 

次の擬似コードを使用すると、詳細が示されます。最初に、取り込まれたマルチキャストストリームの再生と記録を実行する Streamインスタンスを設定します。

 

var stream = Stream.get("mp4:multicast-ingest.f4v");

 

次に、サーバーサイド NetConnection NetGroup を設定し、マルチキャストストリームがパブリッシュされるグループに参加させます。

 

var nc = new NetConnection();

nc.onStatus = function(info) {

if (info.code == "NetConnection.Connect.Success") {

ng = new NetGroup(nc, groupspec);

ng.onStatus = ngStatusHandler;

}

};

nc.connect("rtmfp://<ams-introduction-server>...");

NetGroupステータスイベントを処理するコードを記述します。グループに参加すると、それが "NetGroup.Connect.Success" イベントによって示され、マルチキャストストリームの取り込みを開始します。

 

function ngStatusHandler(info) {

if (info.code == "NetGroup.Connect.Success") {

ingest = ng.getMulticastStreamIngest(sourceStreamName);

}

}

取り込まれたマルチキャストストリームを再生し、このマルチキャストストリームを記録し、再生を停止します。

stream.playFromGroup(ingest);

 

// The stream can be recorded locally.

stream.record();

...

stream.record(false); // And recording stopped.

 

// To stop playback of a multicast stream, pass the Boolean false.

stream.playFromGroup(false);

注意サーバーサイド再生リストはサポートされていません。ただし、回避策があります。取り込まれた Stream から 2 つ目の Stream オブジェクトへのリモート Stream 再生を作成します2 つ目の Stream オブジェクトを再生リストの一部として使用します。

 

 

ピアアシストネットワーキングアプリケーションの例

ActionScript 3.0 リファレンスガイド」のNetGroupのエントリにはピアアシストビデオおよびテキストチャットの例が記載されていますこの例はFlex MXML ファイルですFlash Builder の代わりに Flash Proを使用するにはAS ファイルになっている NetGroup.post() エントリの例を参照してください。

アドビ システムズ社の伝道者、Tom Krcha のブログ「FlashRealtime.com」には、いくつかのチュートリアルとビデオチュートリアルがあります。

 

 

 

最終更新日 2013/9/30