Second Physical Communication Laboratory

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にパスを指定しましょう。

Comments Off more...

FlashでP2P接続をするサンプルコード

by admin on 9 月.14, 2011, under Adobe Flex3, 知識をわすれない

e382b9e382afe383aae383bce383b3e382b7e383a7e38383e38388-2011-09-14-214015Flash 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>

Comments Off more...

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にくらべて細やかに設定ができるようになっています。

https://github.com/OpenRTMFP/Cumulus#readme

Comments Off more...

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からコピーしてきましょう。

Comments Off : more...

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

&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="init()"
layout="absolute"&gt;

&lt;mx:Script&gt;
&lt;![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 = "";
}
]]&gt;
&lt;/mx:Script&gt;
&lt;mx:Panel id="VideoPanel" title="Bijo Chat" backgroundColor="0xb1bfc5" &gt;
&lt;mx:HBox  id="Menuframe"&gt;
&lt;mx:Button id="connectOpen" x="0" y="0" label="公開開始"  fontSize="10" click="connect_chat()" visible="true" textRollOverColor="0xdeb700" /&gt;
&lt;mx:Button id="connectClose" x="100" y="0" label="シャッフル" fontSize="10" click="shuffle_chat()"  visible="true" textRollOverColor="0xdeb700"/&gt;
&lt;/mx:HBox&gt;
&lt;mx:HBox  id="Hframe"&gt;
&lt;mx:VBox  id="Videoframe"&gt;
&lt;mx:VideoDisplay x="0" y="0" width="320" height="180" id="streamview"  visible="true" backgroundImage="@Embed('iphone-camera-icon.jpg')"/&gt;
&lt;mx:VideoDisplay x="0" y="10" width="320" height="180" id="cameraview"  visible="true" backgroundImage="@Embed('iphone-camera-icon.jpg')"/&gt;
&lt;/mx:VBox&gt;
&lt;mx:VBox  id="Textframe"&gt;
&lt;mx:TextInput id="message" width="100%" enter="sendMsg()" /&gt;
&lt;/mx:VBox&gt;
&lt;/mx:HBox&gt;
&lt;/mx:Panel&gt;
&lt;/mx:Application&gt;

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&lt;IClient&gt; clients = scope.getClients();
Iterator&lt;IClient&gt; it = clients.iterator();
Object[] params = new Object[]{startX, startY, endX, endY};
while(it.hasNext())
{
IClient client = it.next();
Set&lt;IConnection&gt; connset = client.getConnections();
Iterator&lt;IConnection&gt; 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
{
}
Leave a Comment :, more...

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.

  1. Down load the “Flex3SDK” from Adobe site.
    http://www.adobe.com/products/flex/flexdownloads/#sdk
  2. Exstract Zip file, and movie it to C:\.
  3. 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\
  4. 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>
Leave a Comment more...