2011年6月29日水曜日

コネクト時の情報をしらべる。@red5

接続時にSWFプレーヤーから送信される情報について・・・です。

データはMapの形式でIConnectionのオブジェクトからgetConnectParamsのメソッドで取得できます。
{objectEncoding=0, app=liveHelper, fpad=false, flashVer=MAC 10,3,181,34, tcUrl=rtmp://localhost/liveHelper, audioCodecs=3191, videoFunction=1, pageUrl=http://localhost:5080/demos/publisher.html, path=liveHelper, capabilities=239, swfUrl=http://localhost:5080/demos/publisher.swf, videoCodecs=252} 
System.out.printlnで中身を取得してやるとこんな情報が・・・
特筆すべきところはrtmpのアドレスにqueryを追加してやると
rtmp://localhost/liveHelper?testといれるとtcUrl=rtmp://localhost/liveHelper?testとなる上にあらたな要素queryString=?testというのが追加されますね。(app指定がliveHelper?testにかわりました。)

仮にFlashMediaLiveEncoderで接続したらこんな感じ

{app=liveHelper, flashVer=FMLE/3.0 (compatible; FMSc/1.0), tcUrl=rtmp://localhost/liveHelper, path=liveHelper, type=nonprivate, swfUrl=rtmp://localhost/liveHelper}
flashVerのところにFMLE/3.0なんていう特殊なものいれることができるんですね。
compatible; FMSc/1.0と書いてあるところをみると、バージョンがあがるとRed5ではFMLEで放送できなくなるかもしれませんね。


とここでおわったら面白くないのでさらに一歩踏み込んでみたいとおもいます。
僕はRtmpClient信者でもあるわけですが、これでこのパラメーターを偽装できないか?と思った次第です。結論からいうと可能です。
Red5のソースコードorg.red5.server.net.rtmp/BaseRTMPClientHandler.javaの180行目あたりmakeDefaultConnectionParamsの中身を見てもらえればわかりますが
RtmpClient.connectの引数としてMap<String, Object>に適当なデータをいれて渡せばOKみたいですね。
DefaultConnectionParamsをみてみたらわかりますが、そのままですね。swfUrlとかも適当な文字に書き換えてしまえば自由自在のようです。

というわけで思い立ったら即実行してみたいと思います。
利用するのはおなじみ、red5_phpのソースコードより、com.ttProject.TestClass.javaを改変してテストしてみます。
   RtmpClientEx rcex = new RtmpClientEx();
   rcex.setListener(new RcexListener(rcex));
   Map params = rcex.makeDefaultConnectionParams("localhost", 1935, "liveHelper");
   params.put("test", "hogehoge");
   rcex.connect("localhost", 1935, params);



実行結果はこんな感じ

{app=liveHelper, objectEncoding=0, fpad=false, flashVer=WIN 9,0,124,2, tcUrl=rtmp://localhost:1935/liveHelper, audioCodecs=1639, test=hogehoge, pageUrl=null, videoFunction=1, path=liveHelper, capabilities=15, swfUrl=null, videoCodecs=252}
ちゃんとくわわってますね。

0 件のコメント:

コメントを投稿