今回は、アプリケーションレベルマルチキャストです。
マルチキャスト用 NetStream の生成
マルチキャストは 1 対多の通信に向いた方式で、大量のデータを少ない遅延で送りたいときに使用します。遅延と信頼性のどちらを優先させるかを指定するオプションもあります。
マルチキャストを行うには、まずグループに接続します。下がそのサンプルですが、基本的に NetGroup クラスのときに説明したものと同じです。グループにマルチキャストを許可するため、GroupSpecifier.multicastEnabled に true を設定する点だけ変更してあります。
// NetConnection.Connect.Success の時に呼ばれる private function onConnect():void { _groupSpecifier = new GroupSpecifier(GROUPNAME); // マルチキャストの許可 _groupSpecifier.multicastEnabled = true; _groupSpecifier.serverChannelEnabled = true; _netGroup = new NetGroup(_netConnection, _groupSpecifier.toString()); _netGroup.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); }
グループへの接続に成功したら、次は NetStream のインスタンスの生成です。NetStream 編 で紹介したように、2 つ目の引数には GroupSpecifier から生成したグループ識別用の文字列を使います。残りは、通常のストリーミングのときと同様です。publish() メソッドを呼ぶと送信が開始されます。
private var _netStream:NetStream; private var _streamName = "multicaststream";
// NetGroup.Connect.Success の時に呼ばれる private function onNetGroupConnect(group:Object):void { // NetStream のインスタンス生成 _netStream = new NetStream(_netConnection, _groupSpecifier.toString()); _netStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); _netStream.attachAudio(Microphone.getMicrophone()); _netStream.attachCamera(Camera.getCamera()); // パブリッシュ開始 _netStream.publish(_streamName); }
受信側も、NetStream のインスタンス生成時の第 2 引き数がグループ識別子になること以外は、特に注意する点はありません。下が受信側のサンプルです。
// NetGroup.Connect.Success の時に呼ばれる private function onNetGroupConnect(group:Object):void { // NetStream のインスタンス生成 _netStream = new NetStream(_netConnection, _groupSpecifier.toString()); _netStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); // 再生開始 _netStream.play(_streamName); }
マルチキャスト時にも NetStream.send() メソッドを利用する事ができます。使い方は、1 対 1 型とまったく同じです。メタデータなどを送信したいときなどに使えそうです。大きなデータを送るのは避けたほうがよいかもです (特にストリーミング中)。 また、データ配信が必ずしも保障されない事にも注意して使いましょう。
NetStatusEvent (マルチキャスト関連)
マルチキャスト関連でも NetStatusEvent に新しいイベントコードが追加されています。NetGroup 系が 2 つ、NetStream 系が 1 つです。
NetGroup.MulticastStream.PublishNotify // 指定した名前のストリームを発見 NetGroup.MulticastStream.UnpublishNotify // 指定した名前のストリームが消失 NetStream.MulticastStream.Reset // ストリームの情報がリセットされた
イベントコードが PublishNotify と UnpublishNotify のときは event.info.name から対象のストリーム名を取得できます。
これで、イベントハンドラーもだいぶ長くなってきました。こんな感じになってます。
private function netStatusHandler(event:NetStatusEvent):void { switch (event.info.code) { // ... case "NetGroup.Connect.Success": onNetGroupConnect(event.info.group); break; case "NetGroup.Connect.Rejected": case "NetGroup.Connect.Failed": doDisconnect(event.info.group); break; case "NetGroup.Neighbor.Connect": onNeighborArrive(event.info.neighbor, event.info.peerID); break; case "NetGroup.Neighbor.Disconnect": onNeighborLeave(event.info.neighbor, event.info.peerID); break; case "NetGroup.MulticastStream.PublishNotify": case "NetGroup.MulticastStream.UnpublishNotify": onMulticastNotify(event.info.name); break; case "NetStream.MulticastStream.Reset": break; } }
NetStream の新しい属性
NetStream クラスに、RTMFP 関連の属性がいくつか追加されています。ここでまとめてご紹介します。
まずは、配信の信頼性を指定する属性です。映像、音声、データそれぞれについて、信頼性のある配信を行うかどうかを指定する事ができます。型は Boolean で、デフォルト値は true です。False を指定すると遅延を少なくする事ができます。
videoReliable:Boolean // 映像に対し信頼性のある配信を行うか audioReliable:Boolean // 音声に対し信頼性のある配信を行うか dataReliable:Boolean // データに対し信頼性のある配信を行うか
次は、ストリームの記録を制御するための属性です。P2P のストリーム配信をするが記録はさせたくないというときに使えます。ベータ版ではまだ機能しないようです。そのうち修正されると思います。(たぶん)
audioSampleAccess:Boolean // 音声を記録できるか videoSampleAccess:Boolean // 映像を記録できるか
3 つ目は multicastInfo 属性です。マルチキャストの QoS 情報が NetStreamMulticastInfo クラスの属性として保持されています。下は、NetStream.multicastInfo.toString() の出力例です。レートを表す属性はその時点でのスナップショットです。それ以外の属性はマルチキャスト開始以来の合計値を表しています。
sendDataBytesPerSecond=2579.1073684479998 sendControlBytesPerSecond=326.95843920000004 receiveDataBytesPerSecond=0 receiveControlBytesPerSecond=327.96625446400003 bytesPushedToPeers=45639 fragmentsPushedToPeers=532 bytesRequestedByPeers=11963 fragmentsRequestedByPeers=164 bytesPushedFromPeers=0 fragmentsPushedFromPeers=0 bytesRequestedFromPeers=0 fragmentsRequestedFromPeers=0 sendControlBytesPerSecondToServer=0 receiveDataBytesPerSecondFromServer=0 bytesReceivedFromServer=0 fragmentsReceivedFromServer=0 receiveDataBytesPerSecondFromIPMulticast=0 bytesReceivedFromIPMulticast=0 fragmentsReceivedFromIPMulticast=0
そのほかにも QoS をコントロールするための属性がいくつか追加されています。
multicastAvailabilitySendToAll:Boolean //データの有無を全ノードに知らせるか1ノードだけか multicastAvailabilityUpdatePeriod:Number //データの有無を知らせる間隔の指定 (秒) multicastFetchPeriod:Number //存在を知らされたデータを取りに行くまでの間隔 (秒) multicastPushNeighborLimit:Number //積極的にデータを送りつけるノードの最大数 multicastRelayMarginDuration:Number //指定された期間以降もデータを保持する間隔 (秒) multicastWindowDuration:Number //マルチキャスト配信のためにデータを保持する期間 (秒)
コメントする