ADOBE® MEDIA SERVER 5.0.3
デベロッパーズガイド
![]() ![]() ![]() |
翻訳:株式会社サムライズ |
---|
注意
Adobe Media Server® バージョン 5についての本ドキュメントは第三者によって翻訳されたものであり、Adobe Systems Incorporated(アドビ システムズ社)は本翻訳物の正確性や完全性を査閲していません。
RTMFP グループ
FlashPlayer 10.1、AIR 2、Flash Media Server 4
Flash Player 10.1、AIR 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 クラスを使用します。
groupspecsは、「G:01010b...」のように、「G:」で始まり、16進数の桁が続く文字列です。文字列の最初の部分は、グループの変更不可能な IDであり、グループの権限が含まれています。ピアがグループの権限またはプロパティを変更すると、新しいグループが開始されます。文字列では大文字小文字が区別されます。
グループでは、次の操作を行えます。
• 「マルチキャスティング」
マルチキャスティングは、1 人または数人の送信者がグループ内の全員にデータストリームを配信するために使用します。
• 「グループへのメッセージの送信」ポスティングは、多数の送信者がグループ内の全員に少量のデータを配信するために使用します。
直接ルーティングは、オーバーレイルーティング構造を介して 1 人のピアにメッセージを送信するために使用します。
• 「グループ内のオブジェクトの複製」
オブジェクトレプリケーションは、多数の (大量になる可能性のある )オブジェクトでグループ内の全員を同期するために使用します。
ストリームをマルチキャストしたりメッセージを送信したりするには、ActionScriptメソッドを呼び出して送信データを渡します。データはグループ内のその他のノードに到達します。
メッセージをピアに直接ルーティングして、オブジェクトをグループ内で複製するには、ActionScriptコードを記述してデータの配信を図る必要があります。
1 Adobe Media Server に接続します。「rtmfp」URL を 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 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.1、AIR 2、Flash 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()
クライアントは、高い信頼性でピアグループを通じて ActionScriptオブジェクトを送信できます。この機能はオブジェクトレプリケーションと呼ばれます。オブジェクトレプリケーションを使用すると、RTMFPグループのすべてのメンバーが、オブジェクトセットの一貫したビューを持つことができます。この機能は、ワークスペースの複製、ホワイトボードの作成、ファイルの転送、ノードでの操作ログの同期などのために使用できます。
オブジェクトレプリケーションは、グループの自己組織化構造が持つ、変化する接続を利用します。オブジェクトを保持しているノードから、オブジェクトが必要なノードへ、グループ内でオブジェクトが複製されます。各オブジェクトは、グループ全体で一意の番号でインデックス付けされます。オブジェクトは不変であることが必要です。
サンプルアプリケーションを始めとする、オブジェクトレプリケーションの詳細な説明については、アドビシステムズ社の伝道者、Tom Krcha のブログポスト「File Sharing over P2P in Flash Player 10.1 with Object Replication」を参照してください。
グループ内でオブジェクトを複製するには、次のクライアントサイド ActionScript 3.0 API を使用します。
• NetGroup.denyRequestedObject()
• NetGroup.removeHaveObjects()
• NetGroup.removeWantObjects()
• NetGroup.writeRequestedObject()
オブジェクトレプリケーションとその他の RTMFP グループ機能には、次のサーバーサイド ActionScript API を使用します。
Flash Player 10.1、AIR 2、Flash 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.1」、Tom Krcha の Flash Realtimeブログの記事。
アプリケーションレベルのマルチキャスト
デフォルトでは、ピアツーピアメッシュは、RTMFPグループにパブリッシュされたストリームを配信します。この技術は「アプリケーションレベルマルチキャスト」と呼ばれます。
IP マルチキャスト
IPマルチキャストでは、ルーターを使用して、指定された IPアドレスにデータを送信します。ルーターは、IPマルチキャストグループに登録されているすべてのクライアントにデータを送信します。IPマルチキャストを設定するには、IT部門と協力して作業します。パブリッシュ先のアドレスを設定し、トラフィックを適切に転送するように企業のマルチキャストルーターを設定するよう依頼します。
ストリームを IPマルチキャストアドレスにパブリッシュするには、パブリッシュを開始する前に、サーバーサイドActionScriptの NetStream.setIPMulticastPublishAddress() メソッドを呼び出します。
グループ内のサブスクライブしている ( 再生中の ) ピアは、IP マルチキャストアドレスを、自身の GroupSpecifier に追加する必要があります。groupspec を作成するときに、GroupSpecifier.addIPMulticastAddress() を呼び出します。IP マルチキャストアドレスを追加することで、クライアントは、IP マルチキャストトラフィックをリッスンして受信できるようになります。
デフォルトでは、アプリケーションレベルのマルチキャストは、IPマルチキャストと同時に動作します。この技術は「フュージョンマルチキャスト」と呼ばれます。アプリケーションレベルマルチキャストを使用せずに IPマルチキャストを実行するには、GroupSpecifierで次のように設定します。
• GroupSpecifier.peerToPeerDisabled=true
この設定により、ピアツーピアマルチキャストが無効になります。
• GroupSpecifier.multicastEnabled=true
• GroupSpecifier.addIPMulticastAddress() を呼び出します。
このメソッドは、クライアントサイドのアプリケーションだけで呼び出します。サーバーからパブリッシュするには、ストリームはサーバーサイド ActionScript の NetStream.setIPMulticastPublishAddress() メソッドに渡したアドレスにストリームをパブリッシュします。そのアドレスは、クライアントが使用しているアドレスと同じです。
Flash Media Server 4.5
Source-specific multicast(SSM)を使用すると、クライアントがデータを受信する 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とサーバー Bの 2台の 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