イナヅマTVログ

2011.03.22
11:53
author: taikiken
1件のコメント

Flash CS5でmxライブラリを使う

API Documentを見るとmxライブラリが便利そう。
ただ、Flash CS5 標準だと mx.core.ByteArrayAsset しか使えません。
mxライブラリを使うためには Flex SDK をダウンロードし frameworks/libs/ の swc を使えるようにしました。

Flash CS5 プロパティ > Actionscript 設定 > ライブラリパス
でダウンロードしたSDKのswcへリンクします。

+(新規パスの追加) > SWCファイルを参照

flex.swc
framework.swc
mx.swc

の3つのswcを追加しました。

2011.03.14
19:31
author: taikiken
0件のコメント

早まってはいけない、Developer Programに登録していればXcode 4は無料

App Store で Xcode 4 が有料(600円)公開されています。

でもこれ、iOS, Mac の Developer Program に登録していれば無料でダウンロード可能です。
あわてて購入ダウンロードする必要はありません。

Download Xcode 4 for Free

Xcode 4 is a free download for all members of the iOS and Mac Developer Programs. Log in to your account to begin the download.

ま、そんな慌てん坊は私だけってことで…

https://developer.apple.com/xcode/

2011.03.14
16:27
author: taikiken
0件のコメント

アフリエイトを義援金へ、そして+5%計画発動

被災地の皆様、救援活動に汗を流している皆様のご苦労とご心労は想像すらできない過酷なものと推察しております。
これから一人でも多くの命が救われることをお祈りいたします。

私は遠く西の地で今できることをさせていただくつもりです。
そしてまたあの日のように何事も無く笑って過ごせる日を迎えたいと願っています。

当ブログでもささやかながらアフリエイト収入があります。
恥ずかしい位微々たるものですが、それを義援金に使わせていただきます。

また、今後いつも以上に仕事を精一杯して行きたいと考えております。
今までよりも+5%、この5%を毎月義援金として募金させていただきます。
そう簡単なことで無いことは分かっているつもりです。
少しでも明るい未来のために努力を続けたいと思います。

これは私自身への決意表明です。
2011-03-14

2011.03.10
19:28
author: taikiken
0件のコメント

ナニこれ!?スゴ過ぎ!!Flashなゲーム

なんかスゴく良くできたFlashなゲーム。
N社のゲーム・エミュレーターぽく作り込まれてます。
Runs best in Flash 10.1 + on Internet Explorer ってのも冗談なのかなんなのか…
サーバーがs3.amazonaws.comなところは本気も本気なんでしょうか。

https://s3.amazonaws.com/flashsnes/snes.html

ソースもgithubで公開されています。
https://github.com/emcmanus/flashsnes

A Flash port of SNES9x, using Adobe Alchemy

githubのドキュメントをみるとAlchemyでSNES9xエミュレーターを作ってるらしく、現在はWindowsが一番パフォーマンスが良いらしい。
なんか、色々敷居は高そうですが、ものともしない猛者が次々に出てくるんでしょう。

ゲームは苦手なので再現性がどうなのか良くわかりません。
ゲーマーに遊んでもらって感想をコメントいただけると嬉しいです。

2011.03.09
21:32
author: taikiken
0件のコメント

ActionScript 3, マイクから音声を録音する – Wave

没ネタ供養シリーズ、お楽しみいただけたでしょうか。
中途半端な作り込みで少々お恥ずかしいのですが、没ネタということでお許しください。

ActionScriptでの録音処理です。
flash.media.Microphone を使います。

まずマイクを取得します。

var microphone:Microphone = Microphone.getMicrophone();

ゲインとレートを設定します。

microphone.gain = 100;
microphone.rate = 44;

ゲインはMaxの100にしています。
CDなどのレートは44.1KHzなので、44.1と設定したいところですがレートはint型なので44です。

フィードバック(ハウリング)対策のためにsetSilenceLevelを指定します。

microphone.setSilenceLevel(0, 3000);

public function setSilenceLevel(silenceLevel:Number, timeout:int = -1):void

via API Document : http://help.adobe.com/ja_JP/AS3LCR/Flex_4.0/flash/media/Microphone.html?allClasses=1

サウンドと見なす最小入力レベルと、実際に無音状態が始まったと見なすまでの無音時間の長さを設定します。後者は省略可能です。

サウンドと見なす最小入力レベルを 0 にしました。

無音時間の長さは 3000ms(3sec)にしています。
デフォルトの -1 は 2000ms(2sec)になります。

SampleDataEvent.SAMPLE_DATAのリスナーを設定します。

microphone.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);

イベントハンドラ

var byteArray:ByteArray = new ByteArray();
function onSampleData(event:SampleDataEvent):void
{
	while(event.data.bytesAvailable > 0) {
		byteArray.writeFloat(event.data.readFloat());
	}
}

API Documentのサンプルコードにならいwhileを使わず単純に以下のような1行にすると音飛びが発生してしまいました。

byteArray.writeFloat(event.data.readFloat());

SampleDataEvent.SAMPLE_DATA発生間隔にたまっているデータを吐き出させないといけないようです。

最後にWaveへのエンコードですが sazameki を参考にさせてもらいました。
org.sazameki.audio.format.wav.Wav

【おまけ】
夕方に「できる?」な問い合わせがあり時計の針がシンデレラタイムを過ぎた頃にデモができあがったのですが、残念ながら翌朝あっさりキャンセル。

もうひとつ残念なお知らせはじっくり探してみるとライブラリがすでにあったことです。
bytearray.org : MicRecorder, a tiny microphone library

マイクから入力した音声をWave形式で保存したいなら bytearray.org MicRecorder を使うといいよ。

本当に残念なお話でした。
半年近く溜め込んでたものが吐き出せて少しスッキリしています。

2011.03.09
18:09
author: taikiken
0件のコメント

没ネタ供養。ActionScript 3でマイクから録音MP3保存

没ネタ供養。ActionScript 3でマイクから録音Wave(.wav)保存 の続き。
今度はWaveへ変換した録音データをMP3へエンコードし保存します。

fr.kikko.lab.ShineMP3Encoderを使っています。
guthubからダウンロード可能です。
https://github.com/kikko/Shine-MP3-Encoder-on-AS3-Alchemy

fr.kikko.lab.ShineMP3EncoderはオープンソースのMP3エンコーダーShineをベースにAlchemy化されています。
詳細は以前ホストされていたGoogle Codeの方が詳しいかもです。
http://code.google.com/p/flash-kikko/
MP3 encoder in Flash with Alchemyもあわせて読むと良いかもです。

弊社ラボにアップしましたので、ぜひご供養ください。
sidevision Labs : 没ネタ供養。ActionScript 3でマイクから録音MP3保存

デモを作ったのが昨年の9月。
なんとか公開できました。

2011.03.08
20:08
author: taikiken
1件のコメント

没ネタ供養。ActionScript 3でマイクから録音Wave(.wav)保存

電話がきて1日で作り上げたデモFlashでしたが、翌日あっさりキャンセルされたかわいそうなファイルです。
弊社ラボにアップしましたので、ぜひご供養ください。

flash.media.Microphoneで録音してWaveフォーマットで保存できます。
sidevision Labs : 没ネタ供養。ActionScript3でマイクから録音Wave(.wav)保存

2011.03.08
00:53
author: taikiken
0件のコメント

AIR, HTMLLoaderをNativeWindowにaddChildしてはいけません

AIRでHTMLLoaderを使ってHTMLファイルを表示しようとした時の話。
メインウインドウと別にウインドウを開き表示する必要がありました。

AIRのウインドウのベースとなるクラスはNativeWindowです。
DisplayObjectContainerのようなものだと勝手に推測していました。

HTMLLoaderインスタンスはNativeWindowaddChildしないといけないと思い込んで作業を始めました。
結果、表示はされるのですが通常の数倍に拡大されて表示されてしまいました。
scaleX, scaleYが7~8な感じです。

落ち着いてAPIドキュメントを読み直しです。
まずウインドウを作ります。

var option:NativeWindowInitOptions = new NativeWindowInitOptions();
option.resizable = false;
option.systemChrome = NativeWindowSystemChrome.NONE;
option.transparent = false;
option.type = NativeWindowType.LIGHTWEIGHT;
 
var bounds:Rectangle = new Rectangle(0, 0, 400, 300);
var htmlLoader:HTMLLoader = HTMLLoader.createRootWindow(true, option, true, bounds);

HTMLLoader.createRootWindowがポイントになります。
via:API Document
http://help.adobe.com/ja_JP/AS3LCR/Flex_4.0/flash/html/HTMLLoader.html?allClasses=1#createRootWindow()

HTMLLoader オブジェクトを格納する新しい NativeWindow オブジェクトを作成します。このメソッドによって返された HTMLLoader オブジェクトを使用して、HTML コンテンツをロードします。

デフォルトでは(このメソッドの呼び出し時にパラメーターを設定しなかった場合)、新しいウィンドウには標準のシステムクロムが使用され、コンテンツの ScrollBar コントロールが含まれます。新しいウィンドウのプロパティを変更するには、パラメーターを設定します。

ウィンドウにコンテンツを読み込み、スタイルシートを適用すると、グラフィックに関して重大ではない問題が発生する場合があります。このような不具合が表示されるのを防ぐには、visible パラメーターを false に設定します。ウィンドウがコンテンツを読み込んでレイアウトすると、window.nativeWindow.visible プロパティを true に設定するか、window.nativeWindow.activate() メソッドを呼び出して、そのコンテンツを表示します。

HTMLLoader.createRootWindowした時点でHTMLLoaderは自分がのっかる親ウインドウNativeWindowを自ら作り出してすでに乗っかってしまっているようです。
このHTMLLoaderインスタンスをNativeWindowaddChildするとおかしなことがおこる様子。

NativeWindowのプロパティにアクセスするにはHTMLLoaderインスタンスを介して行わないといけないようです。

htmlLoader.stage.nativeWindow.alwaysInFront = true;

なんかとっても気持ち悪いのですが、これが正解のようです。
あとはHTMLLoaderインスタンスを使ってHTMLファイルをロードします。

htmlLoader.load(new URLRequest("http://www.example.com/"));

2011.03.07
12:23
author: taikiken
0件のコメント

ActionScript 3, 生成したTextFieldへのフォーマット指定

動的に生成したTextFieldへのフォーマット指定メモ。

【No Good】

import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
 
var defFormatRight:TextFormat = new TextFormat('_ゴシック', 14, 0xff6633, true, false, false, '', '', TextFormatAlign.RIGHT);
defFormatRight.leading = 6;
var tf:TextField = new TextField();
tf.width = 300;
tf.height = 30;
tf.border = true;
tf.text = '右寄せテスト';
tf.defaultTextFormat = defFormatRight;
addChild(tf);

【Good】

import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
 
var defFormatRight:TextFormat = new TextFormat('_ゴシック', 14, 0xff6633, true, false, false, '', '', TextFormatAlign.RIGHT);
defFormatRight.leading = 6;
var tf:TextField = new TextField();
tf.defaultTextFormat = defFormatRight;
tf.width = 300;
tf.height = 30;
tf.border = true;
tf.text = '右寄せテスト';
addChild(tf);

【Good】

import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
 
var defFormatRight:TextFormat = new TextFormat('_ゴシック', 14, 0xff6633, true, false, false, '', '', TextFormatAlign.RIGHT);
defFormatRight.leading = 6;
var tf:TextField = new TextField();
tf.width = 300;
tf.height = 30;
tf.border = true;
tf.text = '右寄せテスト';
tf.setTextFormat(defFormatRight);
addChild(tf);

【教訓】
TextField.defaultTextFormatを使う時は生成直後にフォーマット設定。

TextFieldへもろもろ設定した後はTextField.setTextFormatを使ってフォーマット設定。

【おまけ】
どうでもいいけど…
flash.text.TextFormatAlignflashx.textLayout.formats.TextAlign に変えても使える。

2011.03.04
12:19
author: taikiken
0件のコメント

FLVPlayback, Videoファイルがキャッシュされるのを回避する

Flashでビデオ再生するのに便利なコンポーネント FLVPlayback。
複数のファイルを連続再生したりとなかなか高機能。
面倒なNetStrem, NetConnectionなどを使わなくてもお手軽にビデオ再生ができるスグレものです。

コンポーネントなのでswfファイルサイズが肥大する。
中の処理がブラックボックスなのでどうなってるか良くわからない。

などなど弊害もあります。

困ることは…

  • アルファが効かない。
    Fade INなどのトランジッションができません。
  • removeChildしても内部で使用していると思われるEvent Listenerが削除されていない様子(未検証)。
    メモリ使用量が増えて行きます。
  • 複数のファイルを再生しようとしているときにレイヤー機能を使わずに違うURLを指定しても前回のファイルが再生される。
    どうもキャッシュが働いているご様子。

動的に生成したFLVPlaybackremoveせずにvisible = falseで利用する時にtrueにした方が良さそうです。

三番目のキャッシュが効いている状態はかなり迷惑です。
VideoEvent.READY が発生せず再生処理に移れません。

ファイル末尾にタイムスタンプをつけて example.flv?99999999 のようなパスにするとアクセスできなくなります。
キャッシュ対策お決まりのタイムスタンプ作戦は使えません。

ダミーファイルに一度アクセスさせる
再生したいファイルにアクセスさせる前にダミーFLVへアクセスさせると、なぜか回避できました。

flvPlayer.source = "flvs/empty.flv";
flvPlayer.source = "flvs/example.flv";

example.flv が実際に再生したいビデオファイルです。
コードのように続けて設定して構いません。
empty.flv がダミーファイルです。
1フレームだけの音声無しのファイルです。

ダミーファイルでなく null でも回避はできたのですが、なんか気持ち悪いのでダミーファイルを介在させることにしました。

FLVPlaybackはかなり便利ですけど、自前でVideo Playerを作った方が良さげな気がします。
買うって手もありますけどねぇ。