NetConnection 編の続きです。今回も Flash Player 10 に対応した開発環境があればお試しいただけます。
前回は、RTMFP ノードから Stratus に接続するところまででした。今回は、ノード間で 1 対 1 のストリーミングを行うため、NetStream クラスを使って RTMFP ノード同士を接続します。
NetStream インスタンス生成
では、まず NetStream のインスタンスを生成します。
下は NetStream のコンストラクタです。RTMFP に対応するため、NetStream のコンストラクタには 2 つ目の引数ができました。この引数は Flash Player 10 以降で有効です。また、プロトコルが RTMP の時には無視されます。
NetStream(connection:NetConnection, peerID:String = "connectToFMS")
現在 2 つ目の引数には、以下の 4 種類のオプションが指定できます。
- NetStream.CONNECT_TO_FMS: FMS への接続
- NetStream.DIRECT_CONNECTIONS: P2P でのストリーム直接配信
- 他のクライアントの ID (NetConnection.nearID): 指定したクライアントからのストリーム受信
- グループ ID: グループへのマルチキャスト (このオプションについては別の機会に説明します)
指定を省略したときのデフォルト値は NetStream.CONNECT_TO_FMS (FMS への接続) です。ですので、クライアント間で直接 1 対 1 のストリーミングを行うときは、必ず 2 つ目の引数を明示的に指定します。その際、指定する値はパブリッシュする側と受信する側で異なります。
以下、送信する側、受信する側、それぞれについて説明します。
RTMFP ストリームのパブリッシュ
まず、ストリームの送信側です。
下が送信側のサンプルです。前回 (NetConnection 編) のコードの続きだと思って見てください。
送信側では NetStream コンストラクタの 2 つ目の引数に DIRECT_CONNECTIONS を指定します。NetStream のインスタンスを生成したら、イベントハンドラーの登録、マイク/カメラ (もしくはどちらか) の設定を行います。
//送信用ストリームの宣言 private var _sendStream:NetStream; // パブリッシュするストリームの名前 private var _streamName = "directstream"; // NetConnection.Connect.Success の時に呼ばれる private function onConnect():void { // NetStream インスタンス生成 _sendStream = new NetStream(netConnection, NetStream.DIRECT_CONNECTIONS); // イベントハンドラーの登録 _sendStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); // マイクとカメラを設定 _sendStream.attachAudio(Microphone.getMicrophone()); _sendStream.attachCamera(Camera.getCamera()); // パブリッシュ開始 _sendStream.publish(_streamName); }
最後に publish() メソッドを呼び出すと送信が開始されます。publish() メソッドの引数はストリームの名前になります。この名前はストリームの受信側も知っている必要があります。
このとき、サウンドのコーデックに Speex を使いたければ、下のように明示的に指定をします。
var microphone:Microphone = Microphone.getMicrophone(); microphone.codec = SoundCodec.SPEEX; _sendStream.attachAudio(microphone);
カメラのコーデックは...指定できるとよいのですが。
RTMFP ストリームの再生
次は、ストリームの受信側です。
こちらは、NetStream コンストラクタの第 2 引数に、送信側のノード ID を、それから、play() メソッドの引数にはパブリッシュ中のストリーム名を指定します。
(受信側は、送信側ノード ID とストリーム名の 2 つの情報が必要ということになります)
受信側も、前回 (NetConnection 編) のコードの続きだと思って見てください。
// 受信用ストリームの宣言 private var _recvStream:NetStream; // パプリッシュしているノードの ID private var _publisherID:String = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // 受信するストリームの名前 private var _streamName = "directstream"; // NetConnection.Connect.Success の時に呼ばれる private function onConnect():void { // NetStream インスタンス生成 _recvStream = new NetStream(netConnection, _publisherID); // イベントハンドラーの登録 _recvStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); // 受信開始 - 引数は送信側 publish() の引数に対応 _recvStream.play(_streamName); }
上のコードを実行したとき、裏では以下のような処理が行われます。
- Stratus に接続したいノードの ID を送信
- Stratus から ID に対応する IP アドレスを取得
- 取得した IP アドレスに対しストリーミング受信用のセッション確立
このコードを実行することで、送信側と受信側の間に新しくセッションが確立されることに注意してください。ストリームの受信ノードが増えるごとに新しくセッション数が増え、それに合わせて帯域も必要になります。
なお、上のコードでは、送信ノード ID とストリーム名の入手手段は考慮していません。その旨ご了承ください。