Adobe Stratusサンプルを読み解く
Stratus Sample Application
がコードといっしょに公開されているので読んでみる。
■NetConnectionでAdobeの提供しているrtmfpサーバstratusにつなぐ
予めDeveloperKeyを手に入れておく。
PLAIN TEXT
Actionscript:
netConnection = new NetConnection();
netConnection.addEventListener(NetStatusEvent.NET_STATUS, netConnectionHandler);
netConnection.connect("rtmfp://stratus.adobe.com/" + DeveloperKey);
NetStatusEventの NetConnection.Connect.Sucess になると、
NetConnection.nearID がとれる
この64桁のIDが、他のPeerから自分につなぐために、
相手が知る必要のある情報
webサービスに登録しておいて、
ユーザー名と照合できるようにしておく
#これがHttpIdManager.asのお仕事
なんだろサンプルでは4つのNetStream使ってるけど、
お互いの2つだけでいけそうだなぁ。
■音声/映像のやり取り
ユーザー名知ってる人に電話かけようかなと思ったら、
webサービスに照合して、相手の64桁のIDをもらい、
それをNetStreamに渡す(identity)
PLAIN TEXT
Actionscript:
incomingStream = new NetStream(netConnection, identity);
incomingStream.play("media-callee");
playすれば音が鳴るし、VideoにattachNetStreamすれば相手の映像が見える
出す方は、DIRECT_CONNECTIONS設定してpublishする
PLAIN TEXT
Actionscript:
outgoingStream = new NetStream(netConnection, NetStream.DIRECT_CONNECTIONS);
outgoingStream.publish("media-caller");
publish,playに渡す引数は、電話かける方はmedia-caller,受ける方はmedia-calleeとしてるけどなんでもよさそう。
ルールを決めておけばよい。
↓clientにonPeerConnectって関数を入れておくと、
誰かPeerがつないできたときに、farIDが取れる。
onPeerConnectがtrueを返せば接続ok、
falseを返せば接続ngッぽいので、
非接続側でもう一度webサービスにfarIDを照合して誰が電話かけてきたのか着信履歴表示や着信拒否ができそうだね
PLAIN TEXT
Actionscript:
var o:Object = new Object
o.onPeerConnect = function(caller:NetStream):Boolean {
status("Callee connecting to media stream: " + caller.farID + "\n");
return true;
}
outgoingStream.client = o;
■RPC
NetStream.sendを使えばPeer2PeerのRPCも簡単。
PLAIN TEXT
Actionscript:
outgoingStream.send("onIm", userNameInput.text, msg); [...]
ExternalInterfaceで送れるデータの限界&全ブラウザ対応のブラクラができた
最初はブラクラなんてつくる気無かったんですが。
今度ExternalInterfaceを使って最大kBオーダーのテキストをjavascript→Flashに渡すようなアプリをつくるかもしれなくて、
ExternalInterface.addCallbackの限界を試したかったんです。
その結果は、IE7、FF2ともに 33,554,432[Byte]まではokだった。
その2倍はNG。IE7,FF2ともにメモリが不足しています、っていってjsがエラーる。
へー。
そしたらExternalInterface.callでFlash→javascriptにどんだけ渡せるのか試したくなる。
16,777,216[Byte]まではok。その2倍はIE7,FF2ともにNG。Flash側でメモリが足りなくなるようで、
IE7,FF2ともに終了。
へーへー。
Opera9.*,Safari3(Windows)も死亡
macは試してない
しかし、意外とたくさん送れるもんだなぁ。
検証コードはこんな
actionscript3
PLAIN TEXT
Actionscript:
package {
import flash.display.Sprite;
import flash.system.Security;
import flash.external.ExternalInterface;
import flash.utils.setTimeout;
public class RPCClient extends Sprite{
private var debug :Boolean = true;
Security.allowDomain('*');
public function RPCClient(){
ExternalInterface.addCallback("xi_send", xi_send);
var message [...]
Firebugのconsole.logが動かないなぁ
as3から
ExternalInterface.call('console.log', obj);
って呼んでるのがたまにスルーされるなーと困ってた@Firebug1.2
http://getfirebug.com/releases/
http://getfirebug.com/releases/firebug/1.3/firebug-1.3.0a4.xpi
1.3.0a4でok
[as3]Marilena Object Detection in AS3
出しました。
http://www.libspark.org/wiki/mash/Marilena
http://level0.cuppy.co.jp/2008/06/marilena_object_detection_in_a.php
詳しくは上の2つを見ていただくとして。
実装してておもしろかったのは、
http://www.libspark.org/browser/as3/Marilena/trunk/src/jp/maaash/ObjectDetection/TargetImage.as
この辺り。
最初全くわからなかったんだけれど、Integral Image というのを使って、ある範囲内の輝度の積分を高速に計算しています。
integral imageについてはこちらが詳しい
Feature Detection using Integral Images
物体認識とかって技術の裏では、こういった算数のような細かい計算の高速化が大きなブレイクスルーだったりするんだなー、って感動した。
[as3][umap]PositionControlの位置を動かす
memo
UMapラッパー自前クラスのコンストラクタはこんな
PLAIN TEXT
Actionscript:
package {
// 省略
public class MyUMap extends UMap {
// 省略
st = s;
super();
setSize(st.stageWidth,st.stageHeight);
//setMapType("hybrid"); // normal / satellite
setCenter(new LatLng(Params.MAP_INITIAL_CENTER_LAT,Params.MAP_INITIAL_CENTER_LNG), 2);
animatePan = true;
[...]
[as3][umap]Markerはvisibleな時のみx,yが更新される
Markerがvisibleでなければ、x,yが地図のpanやzoomしても再計算されない。最後にvisibleだった時のx,yのまま。
多分地図範囲外に出たマーカーの位置計算を省略しようみたいな事だと思う。
自分でマーカーのvisibleを切り替えたりしつつ消えてるマーカーとなにかをhitTestObjectしたときに、当らないな~って。
そもそもhitTestObjectが、visibleでないものとできる、という点もmemo..
UMap、オープンソースになりやがれ !
[as3][umap]地図の左上からのピクセル数を取得
memo
PLAIN TEXT
Actionscript:
package {
public class MyMarker extends Marker {
public function MyMarker(){}
// get x,y from left top of map
public function getXY():Point{
var mapBounds :Bounds = core.getBoundsXY();
var myBounds :Bounds [...]
as3で「この API を使用して RTMP コンテンツにアクセスすることはできません。」なエラー
Debug版FlashPlayer使ってたらこんなエラーが出てた。
SecurityError: Error #2135: セキュリティサンドボックス侵害 : BitmapData.draw:http://.............swf は null にアクセスできません。この API を使用して RTMP コンテンツにアクセスすることはできません。
at flash.display::BitmapData/draw()
at PanelPlay/::onEnterFrameDemo()
なんだろうクロスドメインでもないしと思ってたら
Event.ENTER_FRAMEのイベントで
VideoをbitmapDataにマトリクス使いながらdrawしてたんだけど、
このVideoにattachNetStreamでひもづいてた
NetStreamをcloseした後にdrawしてエラーってたっぽい。
videoをcloseした後drawしなくすればok
SoundMixer.computeSpectrumをrtmpで動かしたい
red5で録画/録音した直後にFFTして見せたいんだけど
SecurityError: Error #2135: セキュリティサンドボックス侵害 : SoundMixer.computeSpectrum:http://192.168.0.85/swf/VoicePlayer.swf は rtmp://192.168.0.85/messageRecorder にアクセスできません。この API を使用して RTMP コンテンツにアクセスすることはできません。
at flash.media::SoundMixer$/computeSpectrum()
at VoicePlayer/::onEnterFrame()
とかエラーダイアログ出る。
どうすりゃいいんだ誰かおしえてください!!
red5のstreamsフォルダをシンボリックリンクでドキュメントルートの下に置いて、
rtmpじゃなくて読みに行けばいけるけど、なんか負けた気がする..
あと Microphone.activityLevel みたいなのって再生時に取れないのかな、再生してる音声の音量。
SoundMixer.computeSpectrum を積分するかな。
FlashDevelop3.0.0Beta3、もうすぐブレークポイント貼れるっぽい
いい感じ。
Outlineタブでクラスの継承っぷりとか見れるのは便利だけど、コード補完ならemacsでもできるしなー
ExternalInterfaceが利かないのは痛いかも。
組み込みのFlashPlayerでは、ExternalInterface.availableはtrueを返すけど、
ExternalInterface.callはスルーされる。
ExternalInterface.call( "function(){ alert('c'); }" );
とか書いてもしれーっと次の行に進む。
F5で実行すると、Outputタブにはこんなふうにでてる。
Adobe fdb (Flash Player Debugger) [ビルド 159086]
Copyright (c) 2004-2006 Adobe, Inc. All rights reserved.
(fdb) run
Player が接続するのを待っています
Player が接続されました。セッションを開始しています。
ブレークポイントを設定して「continue」と入力し、セッションを再開してください。
[SWF] C:\works_data\flex2\mysrc\TestFlashDevelop\TestFlashDevelop.swf - 4,863 バイト (解凍後)
(fdb) continue
ほー
FlashDevelopのフォーラムに、
where is the debugger or host application running?
Good news everyone - in the latest development releases you'll see I managed to host the Flex debugger for traces capture (breakpoints [...]
Opera9.23でwmode=transparentだとExternalInterface.callが動かない
wmode=transparent指定はずすとExternalInterface.call動く
ExternalInterface.availableはtrueを返してくる
Operaのバグ?
9.21でFlashPlayerの不具合?
Opera--