2011年5月14日土曜日

RtmpClientの使い方その2

おつぎは、RtmpClientExの話です。
このクラスはRed5のRTMPClientを継承してつくってあります。
もともとはネット上でRed5のRtmpClientをつかって録画させる等の記事を参考につくっていました。
元ネタ

やってることはActionScriptでNetConnectionとNetStreamを使うのと同じ感じで
RtmpClientとNetStream(BaseRTMPClientHandlerの内部クラスになっています。)を扱っている感じです。ActionScriptではNetConnectionにaddEventListenerで接続イベントをとったりします。RtmpClientではIPendingServiceCallbackをセットしてやってそこで返答をみて、接続イベントを取得したりします。
元ネタの記事を参考にしつつ、RTMPClientのソースコードをみながらプログラムを組んできたんですが、GW中にふとRTMPClientの元になるBaseRTMPClientHandlerみてやったところやってることがほぼ90%くらい一致しちゃったので、RtmpCLientExはBaseRTMPClientHandlerの機能を補助する程度のプログラムしか書いてありません。
一致してるのに気づいたときは、思わず吹いてしまいました。いきつく先は同じなんですねw。

では、使い方
1:RtmpClientExのインスタンスをつくって、接続先等を指定する。
2:connect実行(オプション付きの方法がいくつかあるので、好きなのを利用すればよい)
3:コネクトが完了したら、playして、つながっているサーバーからのメディアデータをBroadcastStreamでミラーするなり、publishしてほかのサーバーに投げ返すなり好きにすればOKです。
4:IRtmpClientEx.onInvokeやRtmpClientEx.invokeを利用して他のサーバーの関数呼び出しを実行するのもいいと思う。
5:SharedObjectの実装に関しては、昔しらべたときには受け取りは問題ありませんでしたが、送信に難ありでした。(最新のRed5 1.0.0になったときに修正されてるかもしれません。後日しらべる予定)
  rtmpClient = new RtmpClientEx();
  rtmpClient.setScope(scope);
  rtmpClient.setServer(server);
  rtmpClient.setPort(port);
  rtmpClient.setApplication(application);
  rtmpClient.setListener(new RepeatListener(rtmpClient, new StreamListener(outputStream)));
  rtmpClient.connect();
listenerをつけることで接続イベントや関数の実行イベント等やりとりしてます。
たぶんこのlistenerにはSharedObjectの部分将来的に追加するかも。

現行のRed5 RC2(僕が利用しているのはRev.4219)では、SharedObject以外はだいたい満足のいく動作します。
少々不満があるのはonInvokeの返答まわりです。BaseRTMPClientHandlerの実装がたぶん間違っていて、場合によってはエラーになってしまうのでそこはRtmpClientEx側で修正してあります。

onInvokeの返答動作に関してですが、暫定的にIServiceCallを引数として渡してあります。
サーバーから呼び出された関数:call.getServiceMethodName();
サーバーから渡される引数:call.getArguments();
サーバーに応答する返答:call.setStatus(Call.STATUS_SUCCESS_RESULT);を設置してから、返答としてonInvokeがreturnすればOK。
となります。
無理に使わずにRtmpClientEx.invokeを利用して、呼び出し元サーバー側の関数を実行して返答して返した方が無難だと思いますけど。

安定性の件で懸念があり、過去のバージョンのRed5を使っている方もいるかと思いますが、過去のバージョンでRtmpClientExを使うのはお勧めできません。
0.8.0のころはBroadcastStreamに流すとタイムスタンプがおかしくなるのか、なぜか高速再生され、パケットがながれてくるたびに、再生→しばらく停止→再生を繰り返していました。
0.9.1のころに修正されましたが、publishする方がまだきちんと動作していませんでした。
んで、1.0.0のときにpublish側の実装も見直されたようできちんと動作するようになったという・・・

0 件のコメント:

コメントを投稿