Archive for the ‘ActionScript’ Category

    はてなブックマーク - USTREAM Flash Client APIの使い方
    このエントリーをはてなブックマークに追加

    はじめまして、Fusicの杉本です。

    Fusic Advent Calenderのルーレットをノリで作った張本人です。
    ここまで同じ人に複数回当たったり、言い出しっぺの弊社小山が当たっていなかったりと、バグって偏っているのではと責められてきましたが、やっと自分が当たって疑いが晴れた感じです。

    USTREAM API

    USTREAMといえば、先日宇多田ヒカルさんのライブを中継して話題になりましたね。
    同時アクセス10万以上、ユニークユーザ34万5000人、加えてあの画質と音質、USTREAMすごい!と感動した方も少なくないのではないでしょうか。
    また弊社でもUSTREAMを使ったサービスZENPREを提供しています。ご存じない方は是非一度アクセスしてみて下さい。

    さて、USTREAM APIの情報については、こちらに公開されています。

    • Data API Documentationは、ユーザ情報やチャンネルのURL、タイトル、概要などをhtml/json/xml/php形式で返してくれるAPI情報です。
    • Flash Client API Documentation (AsDoc)は、LIVE動画や録画動画のビューワや動画配信するブロードキャスターのFlashをカスタム実装するためのAPI情報です。

    今回はUSTREAMのFlash Client APIについて、ご紹介したいと思います。

    Flash Client API

    ドキュメントはASDoc形式になっていて見慣れた感じですが、コメントが少なく非常に分かりづらいです。
    実装の仕方はここにサンプルなどがあります。ここではビューワの実装方法について説明していきます。
    まずは提供されているswfをロードします。

    Security.allowDomain("*");
    var viewerLoader = new Loader();
    viewerLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onRslLoad);
    this.addChild(viewerLoader);
     
    var applicationDomain:ApplicationDomain = ApplicationDomain.currentDomain;
    var loaderContext:LoaderContext = new LoaderContext();
    var request:URLRequest = new URLRequest("http://www.ustream.tv/flash/viewer.rsl.swf");
     
    loaderContext.applicationDomain = applicationDomain;
    viewerLoader.load(request, loaderContext);

    LoaderのCOMPLETEイベントでtv.ustream.viewer.logicパッケージのLogicクラスをインスタンス化します。

    private function onRslLoad(e:Event):void {
    	var logicClass:Class = viewerLoader.contentLoaderInfo.applicationDomain.getDefinition("tv.ustream.viewer.logic.Logic") as Class;
    	viewer = new logicClass();
    }

    Display Class

    表示するUSTREAM映像の大きさを指定します。上記viewerオブジェクトのdisplayプロパティで値を設定します。width=300,heigth=200くらいが最小値のようです。

    viewer.display.width = 360;
    viewer.display.height = 240;

    Channel ClassとRecorded Class

    チャンネルの設定や動画の再生・停止、音量調整などはこちらのクラスを使います。
    Channel ClassがLIVE配信用、Recorded Classが録画再生用となっています。基本的に使い方は同じですが、動画をロードするメソッドが異なります。

    // LIVE配信用のロード
    viewer.createChannel(channelId);
    // 録画用のロード
    viewer.createRecorded(channelId);

    channelIdが少し分かりづらいですが、以下のようになっています。
    LIVE配信用は、ライブ配信ページのURL「http://www.ustream.tv/broadcaster/*******」の一番最後のスラッシュ以下の数字
    録画再生用は、録画動画受信ページのURL「http://www.ustream.tv/recorded/*******」の一番最後のスラッシュ以下の数
    となっています。このメソッドをたたくと、USTREAMにchannelIdを渡して、動画を読み込み始めます。
    余談ですが、サービスでこのchannelIdをユーザに入力してもらうのは難しいと思いますので、今回は紹介していないUSTREAMのData APIと連携し、番組名の登録でchannelIdを取得するようにしてみてはいかがでしょうか。(ZENPREではそうしています)

    イベント

    次に、その際に発生するイベントについて発生する順番で説明をしていきます。

    • found・・・指定したchannelIdの動画が見つかった時
    • video・・・ビデオが見つかった時
    • audio・・・音声が見つかった時
    • createStream・・・動画ストリームがつながった時
    • getProgressive・・・動画のダウンロードが開始した時
    • progress・・・動画のバッファを読み込む毎に

    その他のイベントについても簡単に説明をします。

    • finish・・・動画が最後まで再生された時
    • destroy・・・インスタンスを削除(destroyメソッドを叩いた)した時
    • muted・・・ミュートした時

    これらイベントは、LIVE配信時と録画再生時では参照するプロパティが異なりますので、注意して下さい。以下に例を示します。

    // LIVE配信時
    viewer.channel.addEventListener("found", function(e:Event):void {
    				// 処理を入れる
    });
    // 録画再生時
    viewer.recorded.addEventListener("found", function(e:Event):void {
    				// 処理を入れる
    });

    動画の再生・停止のイベントがないのがちょっと不便です。これらは自前で実装する必要があります。

    主要なメソッドとプロパティ

    最後にプレーヤを実装する上で注意が必要なメソッドとプロパティを説明をします。

    【メソッド】

    • seek(percent:Number, bufferOnly:Boolean = false):Boolean

    →シーク先の値は、録画動画のトータル再生時間における割合(値は0以上1以下)を第1引数に渡します。後述のプロパティdurationを使って算出します。

    【プロパティ】

    • bufferProgress: Number[読み取り専用]

    →動画データのダウンロードしたバッファーのプログレス値。値は0以上1以下です。

    • duration: Number[読み取り専用]

    →動画のトータル再生時間。単位は秒。

    • seekTo: Number[読み書き込み]

    →seekメソッドと同じ。こちらも値は録画動画のトータル再生時間における割合(値は0以上1以下)のため注意。

    • time: Number[読み取り専用]

    →現在の動画再生時間。単位は秒。

    • volume: Number[読み書き込み]

    →動画の音量。値は0以上1以下です。

    まとめ

    以上、USTREAM Flash Client APIの使い方の紹介でした。
    紹介した以外にも色々なAPIが用意されていますので、興味のある方は是非カスタムプレーヤを作ってみて下さい。またLIVE配信をする時は、通常USTREAMが用意したFlash(Web)かProducerを使うと思いますが、このAPIを使うと自前でブロードキャスタも作れます。

    今年Ustream Asia Inc.も設立され、ストリーム配信が盛り上がってきています。TVやラジオといったメディアの形が見直され、いつでもどこでも誰でも簡単に配信できる環境ができてきています。
    いままで当たり前だったことが崩され、変化していくというのはおもしろいですよね。自分が持っているものでコンテンツ化できるものがないか考えてみると、新しいサービスやビジネスが思いつくかもしれません。その第一歩として、弊社サービスZENPREを使ってみるのはいかがでしょうか。
    と、宣伝をいたしまして終わりたいと思います。
    (私は社内一まじめな人間なので、他の人みたいにボケたり、オチを入れたりしません。)

    長文を最後までお読みいただき、ありがとうございました。
    それでは良いお年を(もう当たらんだろう)

      はてなブックマーク - ZENPREで過去の勉強会をいつでも視聴
      このエントリーをはてなブックマークに追加

      こんにちは。
      ヤマモトです。

      本日(11/25)の15:00に、弊社小山による「TitaniumMobile勉強会」を行いました。
      TitaniumMobileとは、端的に申しますとJavaScriptでiPhoneアプリが作れるツールです。
      アプリとして魅力の多いiPhoneアプリですが、その開発にはObjective-Cという言語を習得する必要があります。
      どれでもそうだと思いますが、新たな言語を習得するのはなかなか骨が折れますね。
      慣れ親しんだ言語でプロダクトができれば、何て素敵なことだろうと思います。
      そのためのアプローチは方方で進んでいて、TitaniumMobileはその中の1つですね。

      弊社でも生粋のJavaScript使いである小山は、先日のエントリで書いたように、
      PHPMatsuriにてユニットホスティング賞を受賞しiPodTouchの贈呈を受けました。
      そしてそれ以来、その魅力にどっぷり浸かり、TitaniumMobileを知ってから短期間でiPhoneアプリを何と2本も開発しました。
      短期間とは1ヶ月位だったと思います。そんな短い期間で、しかも空いた時間で開発してしまいました。

      そんなTitaniumMobileに、ひいてはJavaScriptに興味を持ってもらいたく本日の勉強会を開催し、その模様は「ZENPRE」にて配信しました。

      と、ここまでは経緯について書かせていただきました。

      そんな、何とも魅力のあるTitaniumMobileの勉強会を見てみたかったという方。
      ZENPRE」のサイトへ来てみませんか?
      当然ながら勉強会は終了しているのですが、その模様をZENPRE上であればいつでも見ることができます。

      本日、ZENPREに「プレゼン同期録画機能」を新たにリリースしました。
      これは、動画と同期してスライドも切り替わり、動画だけのプレゼンに比べて飛躍的に表現力を向上させたZENPREでのプレゼンを、
      いつでも堪能できるようになります。

      配信したスライドの操作は記録されるようになり、録画されたUstreamの映像と併せて保存されますので、
      過去に配信されたプレゼンは、いつでも視聴できるようになります。
      生での配信を見ていた方は、「あの時何と言っていたっけ?」と振り返るために、
      見逃した方も、後で時間にゆとりのある時にじっくり見ることができます。

      本日配信した、TitaniumMobile勉強会も以下のアドレスからいつでも視聴できます。
      zenpre.net/p/yBxMn
      いつでもありますから、今日にでも、興味の湧いたときにでも、ぜひご覧ください。

      また、勉強会やセミナーを発信していこうとされている方も、
      無料で利用できるZENPREを使ってみませんか?
      映像のみに比べ表現力が向上し、遠方で見ている方にも伝わりやすくなります。
      また、ストレージの役割ももっていますので、自分が作ったスライド資料もウェブ上ですぐ確認できます。
      配信したプレゼンテーションは記録されますので、自分の活動の履歴にもなります。

      本日リリースを終えて一段落しておりますが、
      まずは使っていただいて、利用者の声をお寄せいただけたらと思います。
      実際に勉強会等で利用してみたという声をぜひとも聞かせてください。
      利用をたくさんされることでしか、このサービスは成長していかないと思います。

      ぜひとも、よろしくお願いします。

      { 2010.9.29 }

      as3cryptoで暗号化

        はてなブックマーク - as3cryptoで暗号化
        このエントリーをはてなブックマークに追加

        こんにちは。
        ユニコーン好きのruby使い、ヤマモトです。

        今回は、ActionScriptで暗号化した文字列を、rubyで複合化して受け取る、というのをやります。

        ActionScriptには as3crypto という便利なライブラリが提供されていて、aesやdesなどのアルゴリズムを使用しての暗号化・複合化が可能です。
        code.google.com/p/as3crypto/

        デモページも用意されていて、コードを書く前にあれこれ試すことができます。
        crypto.hurlant.com/demo/

        SecretKeyからデモが行えますが、簡単な説明としては以下のとおりです。

        Encryption : 暗号アルゴリズム選択(AES,3DESなど)
        Mode : 暗号利用モード選択(CBC,CFBなど)
        Padding : 公開鍵暗号技術規格(PKCS#5)

        KeyFormat に秘密鍵を、
        PlainText に変換したい文字列を入力して Encrypto を押すと暗号化された文字列がCipherTextに表示されます。
        このとき、表示モードをText以外にしないと、バイナリデータとして表示されますので、Hex等でシリアライズするのがいいでしょう。

        で、これの実装方法ですが、
        以下の通り書きました。
        前提として、
        秘密鍵 : “hogehoge”
        暗号化する文字列 : “fugafuga”
        暗号アルゴリズム : AES
        暗号利用モード : ECB
        を使用します。

        as側

        public function encrypt(str:String):ByteArray {
        	var e:ByteArray = new ByteArray();
        	var key:ByteArray = Hex.toArray(Hex.fromString("hogehoge"));
        	var src:ByteArray = Hex.toArray(Hex.fromString(str));
        	var pad:IPad = new PKCS5();
        	var cipher:ICipher = Crypto.getCipher("aes-ecb", key, pad);
        	pad.setBlockSize(cipher.getBlockSize());
        	cipher.encrypt(src);
        	e.writeObject(src);
        	return src;
        }

        これで、

        encrypt_data = encrypt("fugafuga")

        で暗号化の文字列がバイナリで返されます。
        これを、Base64コードに変換してXMLにてrubyに渡し、復号化を行ないます。

        rubyではOpenSSL::Cipherクラスを使用して復号化を行ないますが、
        その前に、受け取るデータのデシリアライズをしなくてはいけません。
        as側で、暗号化文字列をBase64コードに変換していましたので、これを元に戻します。

        require 'base64'
        # encrypt_data = 暗号化された文字列
        encrypt_data_byte = decode64(URI.decode(encrypt_data))

        あとは以下の要領で復号化です。

        def decrypt(data, key)
            c = OpenSSL::Cipher::Cipher.new("aes-128-ecb")
            begin
              c.decrypt
              c.key = "hogehoge"
              c.update(data) + c.final
            rescue Error => e
              logger.error("#{e.message}")
            end
          end
         
        # 復号化された文字列
        decrypt_data = decrypt(encrypt_data_byte)
         
        puts decrypt_data
        ⇒ "fugafuga"

        ロジック中にアルゴリズムや秘密鍵を直接指定していますが、
        そこは定数化などで汎用的にしてください。

        今回は、as・ruby間で行ないましたが、JavaやObjective-Cでも可能です。