dev.convexstyle.net

2006年06月 アーカイブ

YouTube - snapshot (1)

del.icio.us hatena bookmark

最近 YouTube が Video サイトとしてはかなりの人気で、何人かのクリエイターやプログラマーの方々がアプリケーションを作ってますが、自分も YouTube - snapshot というアプリケーションを作ってみた。

YouTube - snapshot
The screenshot of YouTube - snapshot

コンセプトは、YouTube から動画のキーワード検索して HTML 上に表示し、興味のある動画を Flash 内で再生。この動画のこのシーンが面白いとかブログに書き込んで人に伝えたい場合に、YouTube - snapshot で簡単に読み込んだ動画の好きなシーンのスナップショットを取ることです。


【技術】
Linux、Zend Framework、Proxy、MySQL、PHP、Smarty、Pear、Flash 8、Javascript、CSS、Photoshop、Express Install あたり

自分の担当領域は Flash 8、PHP(Flash 関連部分)、MySQL、Pear、Javascript、CSS、ExpressInstall、デザイン等辺りです。他は hotToast の Taro Yamamoto 氏が設定・作成しました。


【ダウンロード】
flash_sample.zip (fla、swf、html、flv ファイルが入っています)
*PHP ファイルに関しては次回の説明の際に提供します。


【ソース】
今回はどの様に Flash で動画のスナップショットを取得するかについて説明することにする。このプロジェクトすべてに関して説明するのは複雑になってしまうため、ポイントのみの端的なものにする。


(1)
ドキュメント上に Video オブジェクトを配置し FLV を Video オブジェクトに割り当てる。今回は FMS ではなく Proxy を通した FLV のため、ローカル接続するイメージで NetConnection オブジェクトで接続を確立する。同時に、NetStream オブジェクトを作成し、FLV の再生を始める。


// NetConnection オブジェクト設定
var nc:NetConnection = new NetConnection();
nc.connect(null);

// NetStream オブジェクト設定
var ns:NetStream = new NetStream(nc);

// Video 設定
sample_video.attachVideo(ns);
ns.play("test.flv");


(2)
上記で設定した FLV のスナップショット取得用プログラムを設定する。
Flash 8 から BitmapData という新しい class が追加され、bitmap データを Flash 内で動的に作成できるようになった。今回はこのクラスを使用することで、動的に動画のスナップショットを作成することにする。この bitmap データを movieClip に格納し表示するために attachBitmap を使用する。ただしこれだけだと単純な bitmap なので、draw 関数により、bitmap オブジェクトに対し、特定のリソースからの bitmap 情報を書き込む。これにより Flash 内で動画の画像が表示される。また、bitmapData オブジェクトが不必要になる場合、dispose 関数を使用し、bitmapData オブジェクトをメモリから開放する関数も設定する。


// snapshot 作成用関数
var bd:BitmapData;

function get_snapshot():Void {
var tmp:MovieClip = _root.createEmptyMovieClip("snap_mc", 10);
bd = new BitmapData(sample_video._width, sample_video._height, true, 0x00000000);
tmp.attachBitmap(bd, 1, "auto", true);
bd.draw(sample_video);
tmp._x = 300;
tmp._y = 126;
buttonset_mc.gotoAndStop(2);
save_mc._visible = true;
}

// snapshot 削除用関数
function clear_snapshot():Void {
bd.dispose();
buttonset_mc.gotoAndStop(1);
save_mc._visible = false;
}


(3)
このスナップショットを jpeg として保存する。
上記のままファイルを閉じると、先ほど作成した bitmap のスナップショットをデータとして保存することが出来ないため、getPixel を使用して 1 pixel ごとの bitmap の色情報を取得する。その色情報は PHP で管理しやすい様に、16 進数に変更し、Array に格納する。最後に LoadVars で色情報を PHP に送信するために toString 関数により Array 情報を一時的に string 化し、bitmap の幅・高さの値と共に LoadVars オブジェクトによりサーバ側に送信する。


// snapshot の色情報取得用関数
function save_snapshot():Void {

var colors:Array = new Array();
var w_total:Number = sample_video._width;
var h_total:Number = sample_video._height;

for(var w_each:Number = 0; w_each <= w_total; w_each++) {
for(var h_each:Number = 0; h_each <= h_total; h_each++) {
var tmp:String = bd.getPixel(w_each, h_each).toString(16);
colors.push(tmp);
}
}
var colors_str:String = colors.toString();
send_colorinfo(w_total, h_total, colors_str);
}


// snapshot の色情報をサーバ上に送信
function send_colorinfo(w:Number, h:Number, colors:String):Void {
var send_obj:LoadVars = new LoadVars();
send_obj.w = w;
send_obj.h = h;
send_obj.colors = colors;
send_obj.send("./get_snapshot.php", "_blank", "POST");
}


今回は Flash 8 から利用可能な BitmapData オブジェクトを使用し、どの様に動的に FLV の 色情報を取得し、bitmap を生成するかについて説明した。
次回はサーバサイドでどの様に Flash からの色情報を取得し、動的に jpeg を作成するかについてと、その他で覚えておきたいことをまとめることにする。

YouTube - snapshot (2)

del.icio.us hatena bookmark

前回の Flash 部分に引き続き、hotToast で制作した YouTube - snapshot の jpeg 画像作成部分に関して説明する。


YouTube - snapshot
The screenshot of YouTube - snapshot


【使用技術】
Linux、Zend Framework、Proxy、MySQL、PHP、Smarty、Pear、Flash 8、Javascript、CSS、Photoshop、Express Install あたり

【担当領域】
Flash 8、PHP(Flash 関連部分)、MySQL、Pear、Javascript、CSS、ExpressInstall、デザイン辺りです。他は hotToast の Taro Yamamoto 氏が設定・作成しました。


【ダウンロード】
php_sample.zip (php ファイルが入っています)


(1)
Flash から LoadVars により送信された POST 変数を取得する。


// POST 変数取得
$width = $_POST['w'];
$height = $_POST['h'];
$colors = explode(',' ,$_POST['colors']);

(2)
送信されてきた bitmap の幅・高さ・色情報を基に、jpeg ファイルを作成する。
作成の際、下記の様に 1 pixel 単位で RGB 情報を取得し、imagesetpixel で 作成した新規画像に割り当てる。


// 画像の作成
$image = (function_exists('imagecreatetruecolor')) ?
imagecreatetruecolor($width, $height) : imagecreate($width, $height);
$background = imagecolorallocate($image, 0, 0, 0);
imagefill($image, 0, 0, $background);

// pixel 単位の画像作成

$i = 0;
for($x = 0; $x <= $width; $x++) {
for($y = 0; $y <= $height; $y++) {
// 6 文字以下の場合 0 を追加する
while(strlen($colors[$i]) < 6) $colors[$i] = "0".$colors[$i];
// 16 進法の等価の 10 進法に返す
$r = hexdec("0x".substr($colors[$i], 0, 2));
$g = hexdec("0x".substr($colors[$i], 2, 2));
$b = hexdec("0x".substr($colors[$i], 4, 2));
$pixelcolor = imagecolorallocate($image, $r, $g, $b);
imagesetpixel($image, $x, $y, $pixelcolor);
$i ++;
}
}

(3)
最後に Content-type を jpeg 用に指定し、imagejpeg 関数で jpeg ファイルを作成する。


// jpeg ファイルを作成
header('Content-type: image/jpeg');
imagejpeg($image);
imagedestroy($image);

IE での Active X セキュリティー回避 Javascript

del.icio.us hatena bookmark

最近 Flash などの Active X コンテンツを扱うサイトに訪問するたびに、ワンクリックしなければコンテンツがアクティブ化されない。これは SP 2 がインストールされたマシーンでの Internet Explorer の Active X セキュリティの仕様が変更したためらしい。基本的にはサイト上の Flash などの Active X コンテンツはユーザーの何らかのアクションを基に動くものだから、これはユーザーにとっては結構迷惑な話かもしれない。自分も突然 Flash コンテンツ全体が mouseover されるようになって驚いた。

この回避策は凄い簡単。Flash などの Active X コンテンツを外部の Javascript で読みこめば終了。Adobe からもこれに対応した Javascript Library が公開されているし、何人かの開発者の方も自作されている。

http://www.adobe.com/jp/devnet/activecontent/articles/devletter.html

自分も自分の使いやすいように、Active X セキュリティ回避用 Javascript Library(write_swf.js)を作ってみた。様は、swf を HTML 上に表示するために必要な項目、場合によって必要な項目、FlashVars の様に状況に応じて必要な項目を連想配列によって getSwfElement という関数に渡し設定し、writeSwf に swf を表示させたい場所の id を受け渡すことによって表示される。サンプルファイルは下記の通りである。
FlashVars に関して Array の length 分、fv0, fv1, fv2,・・・といった形で Flash 内で取得することができる。また、注意点として、Javascript の内部エンコードと html のエンコードを一致させないと Internet Explorer などでは表示されないので、エンコードは一致させるようにする。ここではエンコードを UTF-8 に統一している。

【ダウンロード】
write_swf.zip


【サンプルソース】


<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>test</title>
<script language="Javascript" type="text/javascript" src="./js/write_swf.js"></script>
<script language="Javascript" type="text/javascript">
<!--
var swf_obj = new Object();

// 必要な項目
swf_obj['Version'] = 8;
swf_obj['URL'] = './test.swf';
swf_obj['width'] = '550';
swf_obj['height'] = '400';
swf_obj['id'] = 'test';

/*
// 下記の変数が必要な場合、コメントアウトを取り記述する
swf_obj['align'] = 'middle';
swf_obj['allowScriptAccess'] = 'sameDomain';
swf_obj['quality'] = 'high';
swf_obj['bgcolor'] = '#000000';
*/

/*
// FlashVars が必要な場合は、コメントアウトを削除し、下記の形式で記述する
swf_obj['flashvars'] = new Array('test1', 'test2');
*/

getSwfElement(swf_obj);
//-->
</script>
</head>
<body bgcolor="#FFFFFF">
<div id="swf">
<script language="Javascript" type="text/javascript">
<!--
writeSwf('swf');
//-->
</script>
</div>
</body>
</html>

FIFA World Cup 2006, Germany with Loopy

del.icio.us hatena bookmark

先日日本チームがワールドカップ予選で負けてしまって結構がっかりしてしまいましたが、ワールドカップは本選に入ってかなり面白くて寝不足になってます。個人的にはジェラードのいるイングランドに優勝してもらいたいですが、ブラジルやドイツも調子が良いようだし、難しそうですね。

FIFA World Cup 2006, Germany with Loopy

このワールドカップの流れに便乗して、以前に作った Loopy (スクリーンセーバー)を少しだけカスタマイズした FIFA WorldCup 2006, Germany with Loopy なるものを作ってみました。前回はスクリーンセーバーですが、今回はウェブ上で完結しています。通常の Loopy は新着の画像をひたすら loop しながら流し続けるものでしたが、今回は Flickr API でキーワード検索した結果を Loopy 上に流していく仕様です。もちろんキーワードは『worldcup』です。意外でしたが、ワールドカップの試合の直後とかにこのページにアクセスすると worldcup のライブ感が伝わってくる写真がかなり Flickr の方にアップロードされるいるようで、かなり面白いです。ただし、時間がずれると、時々違う worldcup の写真でフェンシングなどの写真が出てきて拍子抜けしたりもします。

是非、興味がある方は見てみてください。

FIFA World Cup 2006, Germany with Loopy


【サイト URL】
http://www.hottoast.org/fifaworldcup/

【使用技術】
Linux、Proxy、Flickr API、Photoshop、Illustrator、FlashMX 2004、Javascript、CSS など

【担当領域】
同上