GeekChimps
Ubuntu10.04 LTS Desktop日本語Remix CD出ましたね
投稿者: miizasa, カテゴリー: 環境構築
ついにUbuntu10.04 日本語Remixが出ましたねぇ
わたしは一足お先に10.04LTSをアップグレードしましたよ。
そしたら、アップグレードに失敗して起動しなくなってしまいました・・・orz
何が悪かったんだろう・・・途中いくつも失敗してたので嫌な予感はしていました。。。
また環境作り直しかな・・・・めんどくさいので何か考えよう・・・
別のUSBに10.04LTS日本語Remixを入れて上書きインストールすればいけるかな?
まぁがんばってやってみるです。
せっかくRed5勉強会行ってモチベーションあがったのでRed5で何か作ろうと思ってたのに。。。
■Ubuntu10.04LTS Desktop 日本語 Remix CD
Javaフレームワーク「ScooterFramework」
投稿者: miizasa, カテゴリー: Java
Ruby on Railsに影響を受けたらしいフレームワークらしいです。
しかし、Railsを使ったことないので実際にはどう比較していいかわからないのですが。。。
シンプルさが売りのようでCRUD(CreateReadUpdateDelete)ジェネレータとアクティブレコードが特徴みたいです。
動画もアップロードされてたりして観てみましたが簡単そうですねぇ
だまされてるかな?^^;
まぁ実際に自分で触ってみないとわからないですね。
でも1.0ではキャッシュの実装などいろいろ機能的にも興味深いです^-^
ということで時間のあるときに触ってみようっと。。。
■ScooterFramework
http://www.scooterframework.com/download.html
erlyvideo ひそかにiPhoneへのstreamingに対応?
投稿者: miizasa, カテゴリー: Erlang
以前投稿したErlang製のストリーミングサーバであるerlyvideoですが
地道にバージョンアップしていてiPhoneへのHTTPStreamingできると書いてあります。
これまでiPhoneへのストリーミングはDarwinやHTML5などでチャレンジして
思ったようにできていなくて失敗に終わっているけれども
これも試してみようかなぁ
しかし、ちゃんとアプリ作らないとやはりダメな感じがしています。
Mac買わないといけないですか・・・そうですよねぇ
でもやっぱり試してみよう試してみてからでも遅くはない。
※ロゴまでできちゃってるし・・・
■erlyvideo
http://erlyvideo.org/
HTML5 audioタグってどんな感じ?
投稿者: miizasa, カテゴリー: HTML5
HTML5のaudioタグってどんな感じなのか軽くみてみた。というのもiPhoneで再生できたらiPhone内にライブラリいらないなぁと思うので楽チンです。
以前はDarwinStreamingServerで試みたけどネットラジオ的な再生になってしまった。
ブラウザによってフラフラしてる仕様だけどとにかく実際に見てみよう。
-
<audio src="./audio/sample1.mp3" controls autobuffer></audio>
まぁこれだけなんですが
こんな感じでプレイヤー付的な表示でした。
※FireFox3.5だとだめでした。
こんな感じ・・・再生マークが出てるだけ
いやな予感がして再生ボタンをタップしてみると案の定QuickTimeプレイヤー的な画面になり再生します。
こんなんやりたいんじゃない!!!
jPlayerを使ってみても結局同じ・・・やはりできないのか・・・
ま、それは置いといてクロスブラウザ対応は面倒になりそうだなぁ。統一されていくといいのだが・・・
■テスト用URL
http://www.bamboo.mydns.jp/html5/audio/
http://www.bamboo.mydns.jp/html5/audio/demo-01.htm
■jQueryのaudioplayer plugin 「jPlayer」
http://www.happyworm.com/jquery/jplayer/
最近気になるHTML5ですが、ここまで出来るのか?と感心しました。私のブログではFlexを使っていろいろ作っていますが、この記事を見るとすごいなぁと思ってしまいますが騙されませんよ。JavaScriptでもゲームなどはたくさんあるので、これぐらいでは。。。(高速ってのがポイントかもしれませんが)でも試してみたいものですw
Flashとの機能比較などしてる記事などもあります。眺めてみるとデバイスを利用したりする部分は、差として大きいと感じました。なのでHTML5とFlashは機能として重複する部分はあるとしても、用途や分野などで住み分けて共存していくように思います。
■HTML5が高速ゲームエンジンにもなれるというGoogleの実験-結果は大成功
http://jp.techcrunch.com/archives/20100401google-html5-quake/
■HTML5とFlashの機能比較
http://clockmaker.jp/blog/2010/02/flash-vs-html5/
Red5のサーバ側アプリケーションを開発する環境を作成してみたいと思います。
今回はたまたまUbuntuですがWindowsでもMACでも基本的に同じなんで参考までに。。。
Red5インストール
http://code.google.com/p/red5/
から
0.9.1 Final のTarballをダウンロードしてきます。
※Windowsならインストーラをダウンロード
wget http://www.red5.org/downloads/0_9/red5-0.9.1.tar.gz
でもいいですけどね
んで適当なところに解凍して
解凍してできたred5-0.9.1フォルダの中のred5.shを実行すると起動できます。
http://localhost:5080/
にブラウザでアクセスするといつものRed5ページが表示されます。
Eclipseプラグインのインストール
前もってJEEDTとWDTプラグインをインストールしておきます。
「ヘルプ」→「新規ソフトウェアのインストール」
サイトの追加で
http://trac.red5.org/chrome/site/projects/red5plugin/update_0.2.x/
を追加してインストールします。
さて、インストールが終わったら
新規プロジェクト作成で「Web」→「動的Webプロジェクト」
で作成してTargetRuntimeと構成でRed5を選択します。
まぁ新規サーバも登録しておくと起動・停止などの操作ができて楽でしょう。
私は普段Ubuntuを使っているのですが、この前Red5とFlexを使ってライブストリーミングをやったときに困ったのがWebカメラです。Webカメラは持っていますが会社に置いてあって誰かに使われています。また買うのもばかばかしいのでmanycamのような仮想ウェブカメラが無いか探してみました。
仮想ウェブカメラとは、カメラデバイスのストリームにデスクトップを表示したり画像や動画などいろいろなソースを流し込むことができるアプリケーションです。ニコニコ生放送などでも利用してる方がいらっしゃるみたいです。数種のビデオソースを切り替えたりできて便利です。(本物のカメラやビデオ入力やデスクトップ)
WindowsやMACであればManyCamが利用できます。(簡単だけどちょっと重いかな?)
■ManyCam
http://www.manycam.com/
んで今回探してきたのが「WebCamStudio」です。
■WebCamStudio
http://sourceforge.jp/projects/sfnet_webcamstudio/
上記サイトからwebcamstudio_0.53_all.debをダウンロードしてきて
インストーラ形式なのでダブルクリックでもなんでも実行してインストール完了となります。
アプリケーションメニューの「サウンドとビデオ」に登録されるので、そこから実行します。
SourceメニューからDesktopを選択するとデスクトップを表示するようになります。
複数のソースを同時に表示できたりするのでいろいろ試してみるとおもしろいです。
これで以前作ったライブストリーミングも試せるってもんです^ー^
※高級感あふれるデスクトップさらしてしまいましたw
Red5のインストールが面倒だと考えてる人もいると思いますが、基本的にはJavaのアプリケーションなのでJavaの環境さえあれば簡単にできます。
また、クライアントでのRed5開発環境を構築するときに詳しく説明しようと思います。
WindowsやMACの場合にはインストーラが用意されていますが、そんなもの使わなくてもできます。
http://code.google.com/p/red5/
ここからtarballでもzipでも好きな方をダウンロードして展開
red5.shまたはred5.batを実行するだけ
短くてすみません。でも環境をつくるのにやることが少ないので。。。
前回はRed5のoflaDemoを使って動画のストリーミング再生をやりましたが今回はライブストリーミングに挑戦します。とは言ってもカメラやマイクの使い方ぐらいで前回のプレイヤーとあまり変わりません。
実は受信側に至っては前回のプレイヤーがそのまま使えます。streamidだけ合わせるだけで利用できます。
LivePublisher.mxml(ライブパブリッシャー)
-
<?xml version="1.0" encoding="utf-8"?>
-
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300" mouseOut="mouseOutHandler(event);" mouseChildren="true">
-
<mx:Script>
-
<![CDATA[
-
import flash.net.*;
-
import mx.controls.Alert;
-
import mx.core.UIComponent;
-
-
// publicプロパティ===================================================================
-
public var streamid : String = "testlive";
-
public var protocols : String = "rtmp"; // rtmp rtmpt
-
public var host: String = "www.bamboo.mydns.jp";
-
public var videowidth : int = 320;
-
public var videoheight : int = 240;
-
public var publishtype : String = "live"; // live・record・append
-
public var fps: int = 30; // 1~30
-
public var keyframe: int = 1; // 1~48
-
public var quality : int = 90; // 0~100
-
-
[Bindable]
-
public var videoenable : Boolean = true;
-
-
// privateプロパティ===================================================================
-
private var uiC : UIComponent = new UIComponent();
-
private var ncPub : NetConnection = new NetConnection();
-
private var ncView : NetConnection = new NetConnection();
-
private var nsPublish:NetStream;
-
private var nsPlay:NetStream;
-
private var videoURL : String;
-
private var mouseIn : Boolean;
-
private var ctrlvisible : Boolean;
-
-
[Bindable]
-
private var isPlaying:Boolean = false;
-
-
// pablicメソッド===================================================================
-
public function play():void{
-
-
// Viewer用NetConnectionのイベントリスナ設定
-
ncView.addEventListener(NetStatusEvent.NET_STATUS, netViewStatusHandler);
-
ncView.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
-
ncView.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
-
-
// パラメータチェック
-
-
// URL組み立て
-
videoURL = protocols + "://" + host + "/oflaDemo";
-
-
ncView.connect(videoURL);
-
-
}
-
-
public function playstop():void {
-
if (nsPlay) {
-
nsPlay.close();
-
}
-
}
-
-
public function publish():void{
-
-
// パブリッシャ用NetConnectionのイベントリスナ設定
-
ncPub.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
-
ncPub.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
-
ncPub.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
-
-
// Viewer用NetConnectionのイベントリスナ設定
-
ncView.addEventListener(NetStatusEvent.NET_STATUS, netViewStatusHandler);
-
ncView.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
-
ncView.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
-
-
// パラメータチェック
-
-
-
-
// URL組み立て
-
videoURL = protocols + "://" + host + "/oflaDemo";
-
-
//パブリッシャ用コネクション接続
-
ncPub.connect(videoURL);
-
-
}
-
-
public function publishstop():void {
-
if (nsPublish) {
-
nsPublish.close();
-
}
-
}
-
-
// privateメソッド===================================================================
-
// パブリッシュ用NetStatusイベントハンドラ
-
private function netStatusHandler(event:NetStatusEvent):void{
-
switch (event.info.code) {
-
case "NetConnection.Connect.Success":
-
//connectStream();
-
startPublish(publishtype,streamid);
-
break;
-
case "NetStream.Play.StreamNotFound":
-
trace("Stream not found: " + videoURL);
-
break;
-
}
-
-
}
-
// Viewer用NetStatusイベントハンドラ
-
private function netViewStatusHandler(event:NetStatusEvent):void{
-
switch (event.info.code) {
-
case "NetConnection.Connect.Success":
-
connectStream();
-
break;
-
case "NetStream.Play.StreamNotFound":
-
trace("Stream not found: " + videoURL);
-
break;
-
}
-
-
}
-
-
private function securityErrorHandler(event:SecurityErrorEvent):void{
-
trace("securityErrorHandler: " + event);
-
}
-
-
private function asyncErrorHandler(event:AsyncErrorEvent):void{
-
trace("asyncErrorHandler: " + event);
-
}
-
-
private function netIOErrorHandler(event:AsyncErrorEvent):void{
-
trace("netIOErrorHandler: " + event);
-
}
-
-
//
-
private function connectStream():void{
-
nsPlay = new NetStream(ncView);
-
nsPlay.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
-
nsPlay.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
-
-
var video : Video = new Video(this.width, this.height);
-
video.attachNetStream(nsPlay);
-
-
nsPlay.play(streamid);
-
-
uiC.addChild(video);
-
uiC.addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
-
-
this.addChild(uiC);
-
this.setChildIndex(ctrl,1);
-
-
sndonly.visible = !(videoenable);
-
-
btnPlay.selected = true;
-
isPlaying = true;
-
-
}
-
-
-
public function startPublish( publishMode : String, streamName : String ) : void
-
{
-
try
-
{
-
var camera :Camera = Camera.getCamera();
-
var microphone :Microphone = Microphone.getMicrophone();;
-
//
-
if ( microphone != null || camera != null )
-
{
-
// close previous stream
-
if ( nsPublish != null )
-
{
-
// 現在の配信をとめる
-
nsPublish.close();
-
-
}
-
// Setup NetStream for publishing.
-
nsPublish = new NetStream( ncPub );
-
//
-
nsPublish.addEventListener( NetStatusEvent.NET_STATUS, netStatusHandler );
-
nsPublish.addEventListener( IOErrorEvent.IO_ERROR, netIOErrorHandler );
-
nsPublish.addEventListener( AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler );
-
//
-
//nsPublish.client = new CustomClient();
-
-
// attach devices to NetStream.
-
if ( camera != null )
-
{
-
sndonly.visible = false;
-
videoenable = true;
-
// カメラ設定(フレーム・画質など)
-
camera.setKeyFrameInterval( keyframe );
-
camera.setMode( this.width, this.height, fps );
-
camera.setQuality( 0, quality );
-
nsPublish.attachCamera( camera );
-
}
-
else {
-
//カメラなしの場合には、画像表示
-
sndonly.visible = true;
-
videoenable = false;
-
-
}
-
-
if ( microphone != null)
-
{
-
nsPublish.attachAudio( microphone );
-
}
-
-
// Start publishing.
-
nsPublish.publish( streamName, publishMode );
-
-
// ビューア接続
-
ncView.connect(videoURL);
-
-
}
-
else
-
{
-
trace( "Can't publish stream, no input device(s) selected");
-
}
-
}
-
catch( e : ArgumentError )
-
{
-
// Invalid parameters
-
switch ( e.errorID )
-
{
-
// NetStream object must be connected.
-
case 2126 :
-
//
-
trace( "Can't publish stream, not connected to server");
-
trace( "Not connected to server");
-
break;
-
//
-
default :
-
//
-
trace( e.toString() );
-
break;
-
}
-
}
-
}
-
-
private function mouseOverHandler(event:MouseEvent):void {
-
ctrl.visible = true;
-
mouseIn = true;
-
ctrlvisible = true;
-
}
-
-
private function childmouseOverHandler(event:MouseEvent):void {
-
mouseIn = true;
-
}
-
-
private function mouseOutHandler(event:MouseEvent):void {
-
setTimer();
-
mouseIn = false;
-
}
-
-
private function setTimer():void {
-
var stopTimer:Timer = new Timer(3000, 1);
-
stopTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
-
stopTimer.start();
-
}
-
-
private function onTimerComplete(event:TimerEvent):void {
-
if (mouseIn == false) {
-
// 複数回処理しないためのチェック
-
if (ctrl.visible == true) {
-
// Effectによりコンポーネントのvisibleが設定されるのにDelayがあるので
-
// さらなるチェック
-
if (ctrlvisible == true) {
-
ctrl.visible = false;
-
ctrlvisible = false;
-
}
-
}
-
}
-
else {
-
ctrl.visible = true;
-
ctrlvisible = true;
-
}
-
}
-
-
-
]]>
-
</mx:Script>
-
<mx:Style>
-
.PlayStyle {
-
downSkin: Embed("../assets/play_right_g.JPG");
-
upSkin: Embed("../assets/play_right_b.JPG");
-
overSkin: Embed("../assets/play_right_y.JPG");
-
disabledSkin: Embed("../assets/play_right_w.JPG");
-
selectedDownSkin: Embed("../assets/tempStop_g.JPG");
-
selectedUpSkin: Embed("../assets/tempStop_b.JPG");
-
selectedOverSkin: Embed("../assets/tempStop_y.JPG");
-
selectedDisabledSkin: Embed("../assets/tempStop_w.JPG");
-
}
-
.StopStyle {
-
downSkin: Embed("../assets/stop_g.JPG");
-
upSkin: Embed("../assets/stop_b.JPG");
-
overSkin: Embed("../assets/stop_y.JPG");
-
disabledSkin: Embed("../assets/stop_w.JPG");
-
selectedDownSkin: Embed("../assets/stop_g.JPG");
-
selectedUpSkin: Embed("../assets/stop_b.JPG");
-
selectedOverSkin: Embed("../assets/stop_y.JPG");
-
selectedDisabledSkin: Embed("../assets/stop_w.JPG");
-
}
-
</mx:Style>
-
-
-
<mx:Fade id="fadeOut" duration="1000" alphaFrom="1.0" alphaTo="0.0"/>
-
<mx:Fade id="fadeIn" duration="1000" alphaFrom="0.0" alphaTo="1.0"/>
-
<mx:WipeUp id="wipeIn" duration="1000"/>
-
<mx:WipeDown id="wipeOut" duration="1000"/>
-
<mx:Canvas id="ctrl" left="0" top="0" right="0" bottom="0" visible="false" showEffect="fadeIn" hideEffect="fadeOut" alpha="0.5">
-
<mx:VBox left="0" right="0" top="0" bottom="0">
-
<mx:HBox x="63" y="155" width="100%" verticalAlign="middle" horizontalAlign="center" height="50%" mouseOver="childmouseOverHandler(event);">
-
<mx:Button label="閉じる"/>
-
</mx:HBox>
-
<mx:HBox x="63" y="155" width="100%" horizontalAlign="center" verticalAlign="middle" height="50%">
-
<mx:Button styleName="PlayStyle" toggle="true" id="btnPlay" selected="{isPlaying}" width="50" height="50" mouseOver="childmouseOverHandler(event);" />
-
<mx:Button styleName="StopStyle" width="50" height="50" mouseOver="childmouseOverHandler(event);"/>
-
</mx:HBox>
-
</mx:VBox>
-
</mx:Canvas>
-
<mx:Image id="sndonly" left="0" top="0" bottom="0" right="0" source="@Embed('../assets/screen_sound_only.png')" visible="false" mouseOver="mouseOverHandler(event);"/>
-
-
</mx:Canvas>
んでは続いて毎度お馴染みの上っ面
red5live.mxml(上っ面)
-
<?xml version="1.0" encoding="utf-8"?>
-
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" backgroundColor="#FFFFFF" xmlns:ns1="*" creationComplete="init()">
-
-
<mx:Label x="24" y="18" text="Publish"/>
-
<mx:Label x="309" y="18" text="View"/>
-
<mx:Button x="77" y="16" label="配信" click="pub.publish();"/>
-
<mx:Button x="346" y="16" label="受信" click="view.play();"/>
-
<ns1:LivePublisher id="pub" x="24" y="44" width="320" height="240">
-
</ns1:LivePublisher>
-
<ns1:LivePublisher id="view" x="352" y="246" width="320" height="240" videoenable="{pub.videoenable}">
-
</ns1:LivePublisher>
-
-
</mx:Application>
完成したのがこれ
http://www.bamboo.mydns.jp/flex/red5live.swf
ビデオソースやマイクデバイスは先頭のやつを使ってしまっていますが
選択できるようにするといいですね。
しばらく前から興味があって全然試せていないのがメッセージングなんですよねぇ。
まぁBlazeDSはやってたものの(そのうち記事投稿します^^;)他にもいろいろあるんですけどねぇ
最近入れたRed5でもできるっちゃできます。
ここではいくつか候補をあげておこうかなぁと思っています。
ActiveMQ
http://activemq.apache.org/
まぁ言わずとしれたApacheプロジェクト、ApacheGeronimoにも標準搭載という
王道っちゃ王道ですねぇ
HornetQ
http://www.jboss.org/hornetq
JBossプロジェクトで、昔はJBoss messageingとかいう地味な感じだったのが名前を変えて格好良くなったですねぇ。ベンチでActiveMQに勝ったとかなんとか。。。
RabbitMQ
http://www.rabbitmq.com/
ErlangでできたAMQPサーバということで注目しています。一度サーバ立てて失敗したけどリベンジしないとなぁ。
BlazeDS
http://opensource.adobe.com/wiki/display/blazeds/BlazeDS/
Flashでオープンソースでメッセージングっていうとこれですねぇ。
メッセージングだけでなくRPCなどいろいろ機能があるのでお手軽といえばお手軽ですねぇ。
大体こんな感じですかねぇ。他にめぼしいのあるかなぁ?とりあえずJMSは省いています。。。
あとXMPPもありますがJabbaer互換にするならいいですねぇ。
個人的な興味でいうとErlangのRabbitMQですが普通に選んだらActiveMQですよねぇ。。。
何から手をつけていくか悩ましいですw




アイダックモバイル