トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     airで定期的にwebcam画像をアップロードし、ライブカメラを作る。
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
htakumu
Åê¹ÆNo.44785
投稿日時: 2010-4-11 17:54
半人前
居住地:
投稿: 38
使用環境:
Windows 7 HomePremium
AdobeFlashCS4
GoogleChrome,IE8
airで定期的にwebcam画像をアップロードし、ライブカメラを作る。
いまこれをやろうとしています。

生き物を飼育するのでそれを公開したら面白いなぁと思い作ろうと思っています。

一応完成しました。

手順は。

webcamをvideoにアタッチ

timerEventで二秒ごとに設定。

二秒ごとにvideoをbmdでdrawし、jpgEncoderへ。

fsで保存。

FileRefでphpにアップロードしています。

こうすると、sakuraサーバーをレンタルしているのですが、なんだか怒られそうなので、心配です。

転送量はぜんぜん余裕なのですが・・・

少し話がそれましたが、本題の質問です。

せっかくのairなので、phpを使わずにftpでアップロードしたいのですが、

googleでadobe air ftpでも見つかりませんでした。

また、jpg保存して、batでアップすれば!と思ったのですが、意外と厄介でした・・・

airでftpを使えるようなスクリプト、または方法があったら教えてください。

あと、ライブカメラソフトでは有名なのがありますが、今回は、ソフトを使わない方向で考えております。

また、ftpが出来ない場合は、今のやり方に、何か、アドバイスお願いします。(こうすればもっと効率がいいよ!とかです)
961832p
Åê¹ÆNo.44786
投稿日時: 2010-4-11 21:27
常連
居住地: Akiruno-shi
投稿: 155
使用環境:
 
:AS3:
- Adobe Flex SDK, Eclipse, AIR GEAR
- LB.Log AS3, Alcon2

:AS2:
- AMES(ASDT, MTASC, Eclipse, swfmill)
- Natural Entry Point Method
- LB.Log, Zeroi

Pro, Firefox, Chromium(Iron), IE

----------------
Pro,
Re: airで定期的にwebcam画像をアップロードし、ライブカメラを作る。
 
次のリンク先情報は参考になりますでしょうか?
コード自体はFlexのものですが、ActionScript部分を見るとSocketクラスを使ってFTPサーバと直にやり取りしているもようです。
 ・How to Upload Files in Flex FTP - Ntt.cc


----------------
:961832p:
- だんだんAS3に慣れてきた“なんちゃって”AMES使いの日曜プログラマー

htakumu
Åê¹ÆNo.44787
投稿日時: 2010-4-11 22:57
半人前
居住地:
投稿: 38
使用環境:
Windows 7 HomePremium
AdobeFlashCS4
GoogleChrome,IE8
Re: airで定期的にwebcam画像をアップロードし、ライブカメラを作る。
ありがとうございます!

とても参考になります。

ソケットを使うというのは分かりました。

しかし、英語ページで、翻訳しても分かりませんでした・・・

というか、flexは触れたことが無いので、分かりませんでした。

どなたか、たとえば「sample.jpg」をアップロードするだけの単純なスクリプトを教えてください!
961832p
Åê¹ÆNo.44791
投稿日時: 2010-4-13 17:13
常連
居住地: Akiruno-shi
投稿: 155
使用環境:
 
:AS3:
- Adobe Flex SDK, Eclipse, AIR GEAR
- LB.Log AS3, Alcon2

:AS2:
- AMES(ASDT, MTASC, Eclipse, swfmill)
- Natural Entry Point Method
- LB.Log, Zeroi

Pro, Firefox, Chromium(Iron), IE

----------------
Pro,
Re: airで定期的にwebcam画像をアップロードし、ライブカメラを作る。
 
htakumu さん、応答ありがとうございます。いい機会だったので自分もSocketクラスに挑戦してみました。

前に示したリンク先の情報を参考に、FTPでファイルをアップロードするものを自分なりに作ってみることに。
一応うまくアップロードされているようですが、どのタイミングでFTPコマンドを出せばいいのか、まだあまり把握しておらず少し不安です(汗)。
Socketクラス自体の使い方は、FlexでもFlashでも変わらなさそうなので参考になるかもしれません(ソースコードは下にあります)。

 ・実行時のスクリーンショット ※横着してコード内にIDとパスワードを埋め込んでしまったため、今回はスクリーンショットのみです(汗)

画像ファイルはバイナリモードで転送しないと、アップロードされるも画像によっては表示されないものがありました。
また、スクリーンショットにあるログの末尾を見ると、セキュリティサンドボックス侵害(Error #2048)がでているので、場合によってはソケットポリシーファイルが必要になるかもしれないと思いました(Airなら大丈夫なのかもしれません)。

SocketクラスはFTP以外にも、他のサービスと連携できそうなので色々と使えそうですね。勉強になりました。

----------------

以下は、今回使ったソースコードです(関係ありそうな部分は色を変えています)。

package{
    import mx.core.Application;
    import mx.containers.ApplicationControlBar;
    import mx.containers.HBox;
    import mx.containers.VBox;
    import mx.containers.BoxDirection;
    import mx.controls.Label;
    import mx.controls.ToggleButtonBar;
    import mx.controls.TextArea;
    import mx.events.FlexEvent;
    import mx.events.ItemClickEvent;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.ProgressEvent;
    import flash.events.SecurityErrorEvent;
    import flash.net.FileReference;
    import flash.net.Socket;
    //
    import my.Log;
    import my.FlexDefaultComponents;
    //========================================================================//
    public class Main extends Application{
        private var m_log_tarea:TextArea;
        //
        private var m_freference:FileReference;
        private var m_ctrl_socket:Socket;
        private var m_data_socket:Socket;
        //本来、IDやパスワードを埋め込む事は無いです
        private var m_host:String = "************";
        private var m_user:String = "********";
        private var m_pass:String = "************";
        //--------------------------------------------------------------------//
        public function Main() {
            super();
            FlexDefaultComponents.stylesInit();
            Log.trace("i Main");
            //
            this.layout = "absolute";
            this.setStyle("backgroundColor", 0xEFF1F1);
            this.addEventListener(FlexEvent.APPLICATION_COMPLETE, app_complete);
        }
        //--------------------------------------------------------------------//
        private function app_complete(a_event:FlexEvent):void{
            Log.trace("i app_complete:" + a_event);
            //
            var acbar:ApplicationControlBar = new ApplicationControlBar();
            acbar.dock = true;
            var label:Label = new Label();
            label.text = "FlexでFTPサーバと直接やりとりしてみる";
            acbar.addChild(label);
            this.addChild(acbar);
            //
            var root_layout:HBox = new HBox();
            root_layout.setStyle("paddingLeft", 8);
            root_layout.setStyle("paddingTop", 8);
            root_layout.setStyle("paddingRight", 8);
            root_layout.setStyle("paddingBottom", 8);
            root_layout.y = 8;
            root_layout.percentWidth = root_layout.percentHeight = 100;
            this.addChild(root_layout);
            //
            var left_layout:VBox = new VBox();
            left_layout.setStyle("paddingLeft", 8);
            left_layout.setStyle("paddingTop", 8);
            left_layout.setStyle("paddingRight", 8);
            left_layout.setStyle("paddingBottom", 8);
            root_layout.addChild(left_layout);
            //
            m_log_tarea = new TextArea();
            m_log_tarea.setStyle("fontFamily", "_typewriter");
            m_log_tarea.setStyle("fontSize", 11);
            m_log_tarea.editable = false;
            m_log_tarea.percentWidth = m_log_tarea.percentHeight = 100;
            m_log_tarea.text = '';
            root_layout.addChild(m_log_tarea);
            //
            var list_item:Array = [{
                label:"FTP接続", type:"login"
            }
            , {
                label:"ファイル選択", type:"browse"
            }
            , {
                label:"アップロード", type:"upload"
            }
            , {
                label:"FTP切断", type:"logout"
            }
            , {
                label:"ログ消去", type:"eraselog"
            }
            ];
            var tbbar:ToggleButtonBar = new ToggleButtonBar();
            tbbar.direction = BoxDirection.VERTICAL;
            tbbar.buttonMode = true;
            tbbar.dataProvider = list_item;
            tbbar.addEventListener(FlexEvent.CREATION_COMPLETE, tbbar_complete);
            tbbar.addEventListener(ItemClickEvent.ITEM_CLICK, tbbar_item_click);
            left_layout.addChild(tbbar);
            //
            m_freference = new FileReference();
            m_freference.addEventListener(Event.COMPLETE, freference_complete);
            //制御用ソケット
            m_ctrl_socket = new Socket();
            m_ctrl_socket.addEventListener(Event.CONNECT, ctrl_socket_connect);
            m_ctrl_socket.addEventListener(Event.CLOSE, ctrl_socket_close);
            m_ctrl_socket.addEventListener(ProgressEvent.SOCKET_DATA, ctrl_socket_data);
            m_ctrl_socket.addEventListener(IOErrorEvent.IO_ERROR, socket_io_error);
            m_ctrl_socket.addEventListener(
                SecurityErrorEvent.SECURITY_ERROR, socket_security_error);
            //データ用ソケット
            m_data_socket = new Socket();
            m_data_socket.addEventListener(Event.CONNECT, data_socket_connect);
            m_data_socket.addEventListener(Event.CLOSE, data_socket_close);
            m_data_socket.addEventListener(ProgressEvent.SOCKET_DATA, data_socket_data);
            m_data_socket.addEventListener(IOErrorEvent.IO_ERROR, socket_io_error);
            m_data_socket.addEventListener(
                SecurityErrorEvent.SECURITY_ERROR, socket_security_error);
        }
        //--------------------------------------------------------------------//
        //ボタンバーのイベント関数
        //--------------------------------------------------------------------//
        private function tbbar_complete(a_event:FlexEvent):void{
            Log.trace("i tbbar_complete:" + a_event);
            //
            a_event.currentTarget.selectedIndex = -1;
        }
        private function tbbar_item_click(a_event:ItemClickEvent):void{
            Log.trace("i tbbar_item_click:" + a_event);
            //
            m_log_tarea.text += "[" + a_event.label + "]\n";
            switch (a_event.item.type) {
                //「FTP接続」ボタンが押されたら
                case"login"://
                m_ctrl_socket.connect(m_host, 21);
                break;
                //「ファイル選択」ボタンが押されたら
                case"browse"://
                m_freference.browse();
                break;
                //「アップロード」ボタンが押されたら
                case"upload"://
                //モードはバイナリ&パッシブに
                send_command(m_ctrl_socket, "TYPE" + " " + "I");
                send_command(m_ctrl_socket, "PASV");
                break;
                //「FTP切断」ボタンが押されたら
                case"logout"://
                send_command(m_ctrl_socket, "QUIT");
                break;
                //
                case"eraselog"://
                m_log_tarea.text = '';
                break;
            }
        }
        //--------------------------------------------------------------------//
        //制御用ソケットのイベント関数
        //--------------------------------------------------------------------//
        private function ctrl_socket_connect(a_event:Event):void{
            m_log_tarea.text += "ctrl_socket_connect" + a_event + "\n";
            //認証
            send_command(m_ctrl_socket, "USER" + " " + m_user);
            send_command(m_ctrl_socket, "PASS" + " " + m_pass);
            //ディレクトリ移動
            send_command(m_ctrl_socket, "CWD" + " " + "/");
        }
        private function ctrl_socket_close(a_event:Event):void{
            m_log_tarea.text += "ctrl_socket_close" + a_event + "\n";
        }
        private function ctrl_socket_data(a_event:ProgressEvent):void{
            //レスポンスを取得
            var responce:String = a_event.currentTarget.readUTFBytes(
                a_event.currentTarget.bytesAvailable);
            m_log_tarea.text += "ctrl_socket_data[\n" + responce + "]\n";
            //レスポンスコードを取り出す
            switch (responce.substr(0, 3)) {
                //PASVへのレスポンスコードなら
                case"227"://
                //括弧内の文字列を取り出して「,(カンマ)」ごとに配列へ
                var pasv:Array = responce.substring(
                    responce.indexOf("(") + 1, responce.indexOf(")")).split(",");
                //最初の4つでIPアドレスを、残りの2つでポート番号を
                var ip:String = pasv[0] + "." + pasv[1] + "." + pasv[2] + "." + pasv[3];
                var port:int = parseInt(pasv[4]) * 256 + parseInt(pasv[5]);
                //データ用ソケットで接続
                m_data_socket.connect(ip, port);
                //
                break;
            }
        }
        //--------------------------------------------------------------------//
        //データ用ソケットのイベント関数
        //--------------------------------------------------------------------//
        private function data_socket_connect(a_event:Event):void{
            m_log_tarea.text += "data_socket_connect" + a_event + "\n";
            //選んだファイルを読み込む
            if (m_freference.name != null && m_freference.name != "") {
                send_command(m_ctrl_socket, "STOR" + " " + m_freference.name);
                m_freference.load();
            }
        }
        private function data_socket_close(a_event:Event):void{
            m_log_tarea.text += "data_socket_close" + a_event + "\n";
        }
        private function data_socket_data(a_event:ProgressEvent):void{
            var responce:String = a_event.currentTarget.readUTFBytes(
                a_event.currentTarget.bytesAvailable);
            m_log_tarea.text += "data_socket_data[\n" + responce + "]\n";
        }
        //--------------------------------------------------------------------//
        //各ソケット共通のイベント関数
        //--------------------------------------------------------------------//
        private function socket_io_error(a_event:IOErrorEvent):void{
            m_log_tarea.text += "socket_io_error" + a_event + "\n";
        }
        private function socket_security_error(a_event:SecurityErrorEvent):void{
            m_log_tarea.text += "socket_security_error" + a_event + "\n";
        }
        //--------------------------------------------------------------------//
        //FileReferenceのイベント関数
        //--------------------------------------------------------------------//
        private function freference_complete(a_event:Event):void{
            m_log_tarea.text += "freference_complete" + a_event + "\n";
            //選んだファイルの中身を転送
            m_data_socket.writeBytes(m_freference.data, 0, m_freference.size);
            m_data_socket.flush();
            m_data_socket.close();
        }
        //--------------------------------------------------------------------//
        //FTPコマンド送信用関数
        //--------------------------------------------------------------------//
        private function send_command(a_socket:Socket, arg:String):void{
            m_log_tarea.text += "send_command " + arg + "\n";
            //
            a_socket.writeUTFBytes(arg + "\n");
            a_socket.flush();
        }
        //--------------------------------------------------------------------//
    }
}


----------------
:961832p:
- だんだんAS3に慣れてきた“なんちゃって”AMES使いの日曜プログラマー

htakumu
Åê¹ÆNo.44792
投稿日時: 2010-4-13 19:01
半人前
居住地:
投稿: 38
使用環境:
Windows 7 HomePremium
AdobeFlashCS4
GoogleChrome,IE8
Re: airで定期的にwebcam画像をアップロードし、ライブカメラを作る。
すすすすばらしいです!

僕は、Flash CS4しか出来ないので、961832pさんのコードを、FlashCS4で出来るようにしました。

赤いところで色分けをされていてとても分かりやすく、アップロードを成功することが出来ました。

これで、ライブカメラを実装したいと思います。

961832pさんのサポートが無かったら、あきらめていました^^;

本当にありがとうございました。
parao
Åê¹ÆNo.46490
投稿日時: 2010-12-3 19:08
新米
居住地:
投稿: 1
使用環境:
Re: airで定期的にwebcam画像をアップロードし、ライブカメラを作る。
はじめて投稿させていただきます。
ソケットによるファイル転送で上記のプログラムを
とても参考にさせていただきました。
ごにょごにょといじってはみてFTPによるやりとりが可能になりました。

しかし、コンパイルしたPC上では問題なく転送可能なのですが、
他のPCからはファイルの転送こそできるものの
サーバー上(受け側)に生成されるファイルはすべて128KBとなります。
ちなみに他のPCとはAIRアプリケーションをコンパイルしたPCと同じネットワークにあるPC、その他モバイル環境による接続、職場と色々試してみたのですが結果は変わらずでいした。

色々と調べてみたつもりなのですが、お手上げ状態です;
こういった場合の対処方法などご存知でしたらご教授願います。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops