2008 年 5 月 のアーカイブ

openFrameworks #1

2008 年 5 月 12 日 月曜日

openFrameworksを触ってみました。

まずはセットアップのメモ (Win Xp)

openframeworksのサイトを参考に
- openframeworks: about
- openframeworks: installation visual studio (VC++ 2005, express edition)

VSS2005をインストール
- Visual Studio Express Edition の過去のバージョンのダウンロード

Windows SDK for Windows Server 2008 and .NET Framework 3.5をインストール
- Download details Windows SDK for Windows Server 2008 and .NET Framework version 3.5

DirectX Software Development Kitをインストール
- Download details DirectX SDK – (March 2008)

最初printfの書き方すら忘れていて、久々のC、初のC++に苦戦しながら、
前からずっと書きたかったグラデーションを書きました。

以下、勝手な感想
シリアル通信が簡単にできそうなので、インスタレーションものには使えるのかも。
Processingとかが対抗馬な印象だけれど、Cで動くから早そう。
OpenCVとかがaddOnとして使えるから画像処理系も色々できるかも。

-参考
Diamond-square algorithm – Wikipedia, the free encyclopedia
printf – Wikipedia

SyntaxHighlighter

2008 年 5 月 6 日 火曜日

SyntaxHighlighterを導入。
<pre name="code" class="actionscript"></pre>
でコードに色を付けてくれる。

× WordPressのプラグインを使えば、
[sourcecode language='css'] … [/sourcecode] や
[css] … [/css] のような表記でもいけるらしいが、色々微妙で削除。
- WordPress › SyntaxHighlighter« WordPress Plugins
- WordPress › SyntaxHighlighter Plus « WordPress Plugins

× WorPress上に設定パネルができて、使う言語とかオプションを設定できる
プラグインもあったが、<pre>タグではなく、<textarea>タグで
挿入されるのがなんとなく気持ち悪いので削除。
- SyntaxHighlighter @ Open Sourced Brain.

○ 結局、Mark氏が公開しているAS3用のjsだけ追加した。
- AS3 Syntax Highlighting (with SyntaxHighlighter)

△ また、IE6 (Mac OSX 10.5 – Parellels – Win xp) で奇数の行番号が
なぜか全部1になってしまったのだが、対策を考えるのが面倒になって、
<pre name="code" class="actionscript:nogutter">
と書いて、行番号を出さないことにした。
- Configuration – syntaxhighlighter – Google Code

—-
やり方をまとめると、

1) syntaxhigHlighterをダウンロード
http://code.google.com/p/syntaxhighlighter/

2) Mark氏のサイトからAS3用拡張をダウンロード
http://www.digitalflipbook.com/archives/2007/09/as3_syntax_high.php

3) 1を解凍したフォルダ内、dp.SyntaxHighlighter/Scripts に
shBrushAS3.js を追加

4) 3と同様に dp.SyntaxHighlighter/Styles/SyntaxHighlighter.css を
2のStyles内のものと置き換え(見やすいので)

5) jsとcssの入ったフォルダをアップロード

6) js, cssへのパスを通す

<link type="text/css" rel="stylesheet" href="/blog/styes/SyntaxHighlighter.css"></link>
<script language="javascript" src="/blog/scripts/shCore.js"></script>
<script language="javascript" src="/blog/scripts/shBrushAS3.js"></script>
<script language="javascript" src="/blog/scripts/shBrushXml.js"></script>
<script language="javascript">
window.onload = function () {
dp.SyntaxHighlighter.ClipboardSwf = '/blog/scripts/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');
}
</script>

7) 以下のタグでコードを囲む。

<pre name="code" class="actionscript">
 ...
</pre>

FLV周辺の再利用やノイズ対策

2008 年 5 月 3 日 土曜日

たくさんのFLVをいかに効率よく、美しく流すか。
みたいなメモです。

- 前提
Video、NetStreamやNetConnectionなどの処理を
まとめたVideoSpriteクラス、みたいなものを作る。
これらのインスタンスを毎回消去して、新しくnewすると
ブラウザに負荷がかかるので、消去せずに再利用する。

- 再利用と消去
以下に載せたクラスで、再利用前にやるのがsleepメソッド。
本当にいらなくなった時に消去するために呼ぶのがkillメソッド。

- ノイズ防止
FLVはキーフレーム間を差分で描画しているので、無茶な処理をすると
ピンクのノイズが出て、描画がボロボロになります。その対策。

1. 一度playを実行した_ns(NetStream)に再度playをかける時は、
必ずthis._ns.close();を呼んでから。

2. 再生中のものを頭出ししてすぐ再生したい時は
pause(); → seek(0); → NetStatusEventのNetStream.Seek.Notifyを受ける。
→ resume();
(単純に1のように、closeして再度playでもいい気がします)

– 追記(08/05/20):
再生中のものはすでにキャッシュ済みなのですぐ再生可能
→ 単純に1のように、closeして再度playした方が良いです。
—-

まとめると、closeし忘れに注意ということです。

以下 as。

package{

	import flash.display.Sprite;
	import flash.events.NetStatusEvent;
	import flash.media.Video;
	import flash.net.NetConnection;
	import flash.net.NetStream;

	public class VideoSprite extends Sprite

		private var _video:Video;
		private var _nc:NetConnection;
		private var _ns:NetStream;

		public function VideoSprite():void{
			this._video = new Video();
			this.addChild(this._video);
			//NetConnectionをnew
			this._nc = new NetConnection();
			this._nc.connect(null);
			//NetStreamをnew
			this._ns = new NetStream(this._nc);
			var customClient = new Object();
			this._ns.client = customClient;
			//NetStreamをattach
			this._video.attachNetStream(this._ns);
			//イベント定義
			this._ns.addEventListener(NetStatusEvent.NET_STATUS, this.statusHandler);
		}

		//NetStatusEvent処理
		private function statusHandler(event:NetStatusEvent):void
		{
			switch(event.info.code) {
				// 省略
				default:
					break;
			}
		}

		//色々省略

		//再利用時のクローズ作業
		public function sleep():void{
			this._video.clear();
			this._nc.close();
			this._ns.close();
		}

		//消去時
		public function kill():void {
			this.sleep();
			this.removeChild(this._video);
			this._ns.removeEventListener(NetStatusEvent.NET_STATUS, this.statusHandler);
			this._video.attachNetStream(null);
			this._ns = null;
			this._nc = null;
			this._customClient = null;
			this._video = null;
		}
	}

}