Adobe Flex3
Flash AIR for iOS での SQLite の書き込み制限について
by admin on 9 月.15, 2011, under Adobe Flex3, 未分類, 知識をわすれない
ちょっとはまったのでメモしておきます。
iPhone用にAIRを作った際にSQLiteの書き込みが出来ずなやんでいましたが、ファイルを作成する場所を指定しなくては行けないようです。
var dbfile:File = new File(”app-storage:/db.db”);
このようにapp-strageにパスを指定しましょう。
FlashでP2P接続をするサンプルコード
by admin on 9 月.14, 2011, under Adobe Flex3, 知識をわすれない
Flash Builderで作成しました。コマンドラインでもコンパイルできると思います。
ランデブーサーバはAbobe LabのStratusを利用します。ご自身でKEYを取得していただく必要があります。
https://www.adobe.com/cfusion/entitlement/index.cfm?e=cirrus
<?xml version=”1.0″ encoding=”utf-8″?>
<s:View xmlns:fx=”http://ns.adobe.com/mxml/2009”
xmlns:s=”library://ns.adobe.com/flex/spark” title=”HomeView“>
<fx:Declarations>
<!– 非ビジュアルエレメント (サービス、値オブジェクトなど) をここに配置 –>
</fx:Declarations>
<s:View xmlns:fx=”http://ns.adobe.com/mxml/2009”
xmlns:s=”library://ns.adobe.com/flex/spark” title=”HomeView“>
<fx:Script>
<![CDATA[
import flash.events.NetStatusEvent;
import flash.net.NetConnection;
import flash.net.NetStream;
private const URL_CONNECT:String = "rtmfp://bijochat.com";
private const PUBLISH_NAME:String = "rtmfp_test";
private var netConnection:NetConnection = null;
protected function button1_clickHandler(event:MouseEvent):void
{
// TODO Auto-generated method stub
netConnection = new NetConnection();
netConnection.addEventListener(NetStatusEvent.NET_STATUS, netConnectionHandler);
netConnection.connect(URL_CONNECT);
}
private function netConnectionHandler(event:NetStatusEvent):void {
log.text += "NetConnection event: " + event.info.code + " " + netConnection.nearID+ "\n";
}
]]>
</fx:Script>
<s:Button x=”10” y=”69” label=”ボタン” click=”button1_clickHandler(event)”/>
<s:TextInput id=”key0” x=”5” y=”10“/>
<s:TextArea id=”log0” x=”10” y=”171” height=”238“/>
</s:View>
<s:TextInput id=”key” x=”5” y=”10“/>
<s:TextArea id=”log” x=”10” y=”171” height=”238“/>
</s:View>
FlashのP2Pサーバをオープンソースで実現するOpenRTMFP
by admin on 9 月.14, 2011, under Adobe Flex3, 知識をわすれない
Flash10からP2P通信が利用できるようになりました。
P2PをつかうとFlashプレイヤ同士で音声や動画が直接やり取りできるようになるので、GoogleTalkなどのようなサービスで有効です。また、AIRも対応しますのでiOSやAndroid2.2以上のスマートフォンでもアプリとして開発利用できるのも魅力です。
P2Pといえども、nodeを管理するために「ランデブーサービス」サーバーが必要となりますが、いまのところRTMFPサーバはAdobe Labの Stratusが解放されています。
ここにきて、オープンソースのRTMFPサーバがいくつか開発されています。
https://github.com/OpenRTMFP
1.ArcusNode
サーバサイドでjavascriptを動かすことができるnodeベースで開発されたRTMFPサーバです。
インストールはダウンロード後、node service.jp で起動しますのでとても簡単に導入できます。
サービス(デーモン)として起動したい際のスクリプトを記載しておきます。
https://github.com/OpenRTMFP/ArcusNode
/etc/init.d/ArcusNode
#!/bin/bash
# For RedHat and cousins:
# chkconfig: 2345 85 85
# description: ArcusNode flash streaming server
# processname: ArcusNode
# Created By: Sohail Riaz (sohaileo@gmail.com)
PROG=ArcusNode
ArcusNode_HOME=/home/sysadmin/dl/OpenRTMFP-ArcusNode-c330db7
DAEMON=$ArcusNode_HOME/$PROG.sh
PIDFILE=/var/run/$PROG.pid
# Source function library
. /etc/rc.d/init.d/functions
[ -r /etc/sysconfig/ArcusNode ] && . /etc/sysconfig/ArcusNode
RETVAL=0
case "$1" in
start)
echo -n $"Starting $PROG: "
cd $ArcusNode_HOME
$DAEMON >/dev/null 2>/dev/null &
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
echo $! > $PIDFILE
touch /var/lock/subsys/$PROG
fi
[ $RETVAL -eq 0 ] && success $”$PROG startup” || failure $”$PROG startup”
echo
;;
stop)
echo -n $”Shutting down $PROG: ”
killproc -p $PIDFILE
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$PROG
;;
restart)
$0 stop
$0 start
;;
status)
status $PROG -p $PIDFILE
RETVAL=$?
;;
*)
echo $”Usage: $0 {start|stop|restart|status}”
RETVAL=1
esac
exit $RETVAL
2.Cumulus
こちらはmake make installが必要です。開発が先行していることもあり、ArcusNodeにくらべて細やかに設定ができるようになっています。
Mac OSX lion に red5 10.0.0をインストールしよう
by admin on 7 月.31, 2011, under Adobe Flex3, 知識をわすれない
新しいOSXはlionという名前がつきました。
今回、2月に出たRed5 10.0.0をlionにインストールしてみましょう。
Red5のサイトでdmg形式のアーカイブがダウンロードできるのですが、インストールしてもlionで動作しません。インストールパッケージでtomcat pluginのパスが間違えているようで、すでにソースバージョンでは、修正されていますが、dmg ではまだのようです。dmgがバージョンアップするのを待ってられないので、今回はソースからインストールします。
まず、svnでRed5 10.0.0をチェックアウトします。OSXのプロンプトを立ち上げ、
svn checkout http://red5.googlecode.com/svn/java/server/trunk/ red5-read-only
で、Macにチェックアウトできます。red5-read-onlyというディレクトリができているので、そこに移動して、
ant clean dist
で、ビルドします。私は、AIRマックで15分くらいかかりますが、エラーなくビルドできました。
distというディレクトリが出来上がっているので、そこに移動して、
sudo ./red5.sh
でRed5が起動します。
あとは、ブラウザで
http://127.0.0.1:5080/
にアクセスするとRed5のホームにアクセスできます。
終了するときは、もう1つターミナルを立ち上げ、
sudo ./redd-shutdown.sh
で、Red5を終了することができます。
distがRed5のルートになっていますので、red5などと名前を変更して、Applicatonsなどに移動しておいてもいいでしょう。
あと、おなじみのdemoなどは、red5のホーム画面からinstallerへ移動してリストを選択してインストールしますが、ソースからインストールしても、webappにフォルダができるだけで中身がコピーされません。どこからかdemoのアプリを探してこないといけないようです。古いred5からコピーしてきましょう。
The simple Vide Chat on Flex3
by admin on 3 月.29, 2010, under ASP, Adobe Flex3, Showcase
I described the program of a very simple video chat out with Flex3 and Red5.
Donwload Flex3 source on FlashDevelop 3.0 here
Download Red5 source and Webapp. here

mxml : main.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="init()"
layout="absolute">
<mx:Script>
<![CDATA[
public var myCameraView:mystreaming = new mystreaming();
private var con:ChatConnection;
private var streamingURL:String = "rtmp://192.168.116.128/buruburu";
private var channetKey:String = "demo";
public function init():void {
con = new ChatConnection();
Textframe.addChild(con.logtext);
}
private function connect_chat():void {
if (connectOpen.label == "公開開始") {
cameraview.attachCamera(myCameraView.myLocalvideo.myCamera);
myCameraView.channetKey = channetKey;
myCameraView.connect_chat();
con.close();
connectOpen.label = "公開中止";
}else {
myCameraView.disconnect_chat();
con.close();
connectOpen.label = "公開開始";
}
}
private function shuffle_chat():void {
var myGuseView:gueststreaming = new gueststreaming();
myGuseView.channetKey = channetKey;
myGuseView.playVideo();
streamview.addChild(myGuseView.video);
con.connect(streamingURL);
}
private function sendMsg():void {
con.call("writeText", null, message.text);
message.text = "";
}
]]>
</mx:Script>
<mx:Panel id="VideoPanel" title="Bijo Chat" backgroundColor="0xb1bfc5" >
<mx:HBox id="Menuframe">
<mx:Button id="connectOpen" x="0" y="0" label="公開開始" fontSize="10" click="connect_chat()" visible="true" textRollOverColor="0xdeb700" />
<mx:Button id="connectClose" x="100" y="0" label="シャッフル" fontSize="10" click="shuffle_chat()" visible="true" textRollOverColor="0xdeb700"/>
</mx:HBox>
<mx:HBox id="Hframe">
<mx:VBox id="Videoframe">
<mx:VideoDisplay x="0" y="0" width="320" height="180" id="streamview" visible="true" backgroundImage="@Embed('iphone-camera-icon.jpg')"/>
<mx:VideoDisplay x="0" y="10" width="320" height="180" id="cameraview" visible="true" backgroundImage="@Embed('iphone-camera-icon.jpg')"/>
</mx:VBox>
<mx:VBox id="Textframe">
<mx:TextInput id="message" width="100%" enter="sendMsg()" />
</mx:VBox>
</mx:HBox>
</mx:Panel>
</mx:Application>AS:mystreaming.as
package
{
import flash.media.Video;
import flash.net.NetConnection;
import flash.media.Camera;
import flash.media.Microphone;
import flash.net.NetStream;
import flash.events.*;
import mx.accessibility.AccImpl;
import flash.display.Sprite;
import flash.events.*;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.net.URLVariables;
import flash.events.NetStatusEvent;
import flash.events.EventDispatcher;
import mx.controls.Alert;
import mx.events.SliderEvent;
import mx.controls.sliderClasses.Slider;
import mx.rpc.events.ResultEvent;
import mx.managers.PopUpManager;
import mx.core.IFlexDisplayObject;
import mx.collections.ArrayCollection;
/**
* ...
* @author yuucha
*/
public class mystreaming
{
public var counter:Number = 0;
private var pub_nc:NetConnection;
private var pub_ns:NetStream;
private var streamingURL:String = "rtmp://192.168.116.128/buruburu";
private var play_nc:NetConnection;
private var play_ns:NetStream;
private var stat:Number;
private var clientID:Number;
private var StreamingCamera:Camera;
private var StreamingMic:Microphone;
public var myLocalvideo:myvideo;
public var video:Video = new Video(320, 180);
public var channetKey:String = "";
public function mystreaming():void
{
myLocalvideo = new myvideo();
}
public function onBWDone(... rest):Boolean {
return true;
}
public function newStream():void {
trace("newStream");
}
public function onBWCheck(... rest):Number {
return 0;
}
public function connect_chat():void {
pub_nc = new NetConnection();
var clientObj:Object = new Object();
clientObj.onBWDone = onBWDone;
clientObj.onBWCheck = onBWCheck;
pub_nc.client = clientObj;
pub_nc.connect(streamingURL);
pub_nc.addEventListener(NetStatusEvent.NET_STATUS,pub_netStatus);
pub_nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSecurityError);
}
public function disconnect_chat():void {
pub_nc.close();
Alert.show("映像の公開を中止しました。");
}
private function pub_netStatus(event:NetStatusEvent):void {
if (event.info.code == "NetConnection.Connect.Success") {
pub_ns = new NetStream(pub_nc);
pub_ns.attachAudio(myLocalvideo.myMic);
pub_ns.attachCamera(myLocalvideo.myCamera);
pub_ns.publish(channetKey, "live");
Alert.show("ストリーミングサーバへの接続に成功しました。");
}
else if (event.info.code == "NetConnection.Connect.Closed") {
pub_ns.close();
Alert.show("ストリーミングサーバへの接続に失敗しました。");
}
else {
trace("error");
}
}
private function onSecurityError(event:SecurityErrorEvent):void {
trace("netSecurityError:" + event);
}
}
}AS:gueststreaming.as
package
{
import flash.media.Video;
import flash.net.NetConnection;
import flash.media.Camera;
import flash.media.Microphone;
import flash.net.NetStream;
import flash.events.*;
import mx.accessibility.AccImpl;
import flash.display.Sprite;
import flash.events.*;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.net.URLVariables;
import flash.events.NetStatusEvent;
import flash.events.EventDispatcher;
import mx.controls.Alert;
import mx.events.SliderEvent;
import mx.controls.sliderClasses.Slider;
import mx.rpc.events.ResultEvent;
import mx.managers.PopUpManager;
import mx.core.IFlexDisplayObject;
import mx.collections.ArrayCollection;
/**
* ...
* @author yuucha
*/
public class gueststreaming
{
private var streamingURL:String = "rtmp://192.168.116.128/buruburu";
private var play_nc:NetConnection;
private var play_ns:NetStream;
public var video:Video = new Video(320, 180);
public var channetKey:String = "";
public function gueststreaming()
{
}
public function playVideo():void{
play_nc = new NetConnection();
var clientObjplay:Object = new Object();
play_nc.client = clientObjplay;
clientObjplay.setId = function setId( id:Number ):void { };
play_nc.addEventListener(NetStatusEvent.NET_STATUS, play_netStatus);
play_nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
play_nc.connect(streamingURL);
}
public function disconnect_chat():void {
play_nc.close();
}
private function onSecurityError(event:SecurityErrorEvent):void {
trace("netSecurityError:" + event);
}
private function play_netStatus(event:NetStatusEvent):void {
trace("netStatus: " + event.info.code);
if (event.info.code == "NetConnection.Connect.Success") {
Alert.show("ストリーミングサーバへの接続に成功しました。");
play_ns = new NetStream(play_nc);
video.attachNetStream(play_ns);
play_ns.play(channetKey);
} else{
trace("error");
Alert.show("ストリーミングサーバへの接続が中断しました。");
}
}
}
}AS:myvideo.as
package
{
import flash.media.Video;
import flash.media.Camera;
import flash.media.Microphone;
/**
* ...
* @author yuucha
*/
public class myvideo
{
public var myCamera:Camera;
public var myMic:Microphone;
public function myvideo():void{
camera_init();
}
public function camera_init():void {
myCamera = Camera.getCamera();
myCamera.setMode(320,180, 30, true );
myCamera.setQuality(163840,0);
myMic = Microphone.getMicrophone();
myMic.rate = 44;
}
}
}AS:ChatConnection.as
package
{
import flash.net.NetConnection;
import mx.controls.TextArea;
public class ChatConnection extends NetConnection
{
public var logtext:TextArea = new TextArea();
public function ChatConnection()
{
super();
logtext.width = 640;
logtext.height = 320;
}
public function writeText(message:String):void
{
logtext.text = message + "n" + logtext.text;
}
public function setlogtext(t:String):void
{
logtext.text = t;
}
public function getTextArea():TextArea
{
return logtext;
}
}
}red5: buruburu.java
If you don’t want to use Text chat, you don’t need this code on your Red5 Webapp.
import java.util.Iterator;
import java.util.Set;
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IClient;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.api.Red5;
import org.red5.server.api.service.IServiceCapableConnection;
public class Application extends ApplicationAdapter
{
// クライアント側から呼ばれるメソッド
public String drawLine(IConnection conn, int startX, int startY, int endX, int endY)
{
IScope scope = Red5.getConnectionLocal().getScope();
Set<IClient> clients = scope.getClients();
Iterator<IClient> it = clients.iterator();
Object[] params = new Object[]{startX, startY, endX, endY};
while(it.hasNext())
{
IClient client = it.next();
Set<IConnection> connset = client.getConnections();
Iterator<IConnection> it_con = connset.iterator();
while(it_con.hasNext())
{
IConnection connection = it_con.next();
if(connection instanceof IServiceCapableConnection)
{
IServiceCapableConnection sc = (IServiceCapableConnection)connection;
// クライアント側のメソッドを呼ぶ
sc.invoke("drawLine", params);
}
}
}
return "OK";
}This version is the less text chat.
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IClient;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.api.Red5;
import org.red5.server.api.service.IServiceCapableConnection;
public class Application extends ApplicationAdapter
{
}Install the Flex3 on WindowsXP
by admin on 1 月.17, 2009, under Adobe Flex3
This page is written that how to installed the Flex3 SDK.
- Down load the “Flex3SDK” from Adobe site.
http://www.adobe.com/products/flex/flexdownloads/#sdk - Exstract Zip file, and movie it to C:\.
- If you want to set Path to flex_sdk\bin directory, You shoud set the PATH parameter in the system property setting.
C:\flex_sdk_3\bin\ - Test ont the command prompt screen.
C:\Documents and Settings\xxxxx>cd c:\flex_sdk_3\bin
C:\flex_sdk_3\bin>mxmlc
Adobe Flex Compiler (mxmlc)
Version 3.2.0 build 3958
Copyright (c) 2004-2007 Adobe Systems, Inc. All rights reserved.
mxmlc [options] [defaultVar]詳細については、’mxmlc -help’ を使用してください。
C:\flex_sdk_3\bin>