Adsense

2007年7月31日火曜日

SIM での動画再生あれこれ

昨日はテレポートもできないものだから、、、SUZAKU GP2 の Promo Video の日付修正確認を SUZAKU でできず、、、、(笑

あい、確認しました~

aDate2

リンク名はそのままなので、特に Media URL 変更の必要はございません~。

(あ、先日の Blog 内にリンクしている動画は URL 変わってます、、、すみません...)

SIM というか、SL の中での動画再生ですが、こんなサイズの大きな動画ファイル(35MBほど)だと SIM に影響が、、、なんて思いがちですが、実際のところはその影響は、仕組みから考えると小さいみたいです。

というのも、この動画、、、QuickTime のプラグインが SL のビューアー上で動いているようなものなので、SIM は動画が保存されている外部サーバー(Webサイト)の URL を渡しているだけですね。その後は動画がある Web サーバーと PC クライアントの間で動画ファイル転送が行われて、一時的にダウンロードされた動画ファイルを「 SL ビューアー内」で再生しているわけです。

なので、[View] - [Statistics Bar] で SIM の Performance などを見ても、動画再生中だからといって、これといって SIM の数値が悪くなる、、、ということはありませんね。

もちろん、最初の動画ファイルのダウンロード中は、クライアントが、、カクッ、、、、と動きが止まりますが、、、(笑
再生中では、クライアントのパフォーマンスに影響する Statistics Bar の項目(FPS, KTris Drawnなど)が悪くなります。やはり、PC 側のグラフィックボードなどの性能に左右されますね。

で、この仕組み、、、、ちょっとおもしろい挙動をするんです。。。

というのも、、、、みんなで同じものをみているか、、、といったら、違うときもあるからです。

わかりやすく例えれば、Web サイトの動画ファイル、、、みんな同じタイミングでみているわけじゃないんですよね~。
You Tube とかの動画ファイル、、、そのページをアクセスしているユーザーが同じタイミングで、同じビデオの箇所をみているわけではない、、、、そういうことですね~。
再生のタイミングはみんな違いますからね。
もっとややこしくなるのは、、、Start/Stop の操作や Media の URL をスクリプトから変更するようなものをつくった場合、、、でした。。。(この場合、スクリプトが入っているオブジェクトのオーナーは区画の Media URL を変更できる権限をもっている人でないとだめです)
通常、Land設定の [Media] の Media texture にムービーの URL を設定しておくと、SLビューアーの Movies タブの再生ボタンを押せば、そこで設定されている動画をスクリーンでみることができますよね。(それでも、再生のタイミングは上述の理由より個々それぞれ違います)
ところが、この設定をスクリプトでやると、、、スクリプトの組み方で、いろいろな挙動を見ることができます。
たとえば、Inventory の Library の objects フォルダーにある "Media Player" を Rez して、そのオブジェクトの再生、Pause、停止ボタンを使えば、、、その区画にいる人がみているスクリーンは同じタイミングで Land 設定の Media で指定されている動画の「再生」「ポーズ」「停止」がされます。
ですが、SL ビューアーの Movies / ムービー タブで、自分の判断で停止、再生ができますので、それをやれば、「自分の動画だけに影響」する形で動画の制御ができます。その後、映像が同期しないまま、Media Player の制御で、再生、ポーズ、停止とさせられます。
おもしろいのは、、、、以下のように Notecard から URL を読み込み、List いれて、Touch 毎に URL を変更するスクリプトだと、、、、なぜか、Land の URL は変更されないまま、画像だけがかわるんです。
(追記 2007/10/14:上記の記述は正しくありませんでした。以下の Source の赤い部分の         PARCEL_MEDIA_COMMAND_AGENT, llDetectedKey(0), によって、タッチしたアバターだけに Media Command を適用しているからです。もしの PARCEL_MEDIA_COMMAND_AGENT に NULL をいれると、土地の Media URL が変更権限を与えられている スクリプト・オブジェクト により変更され、その時点でそこで Media を見ている人全員の動画も切り替わります。大変失礼しました、、、)

////////////////////////////////////////////////////////////////////
// name of a notecard in the object's inventory
string gName;
// current line number
integer gLine = 0;
// id used to identify dataserver queries
key gQueryID;
list urlList;
key VIDEO_DEFAULT = "6e0f05ad-1809-4edc-df29-fae3d2a6c9b8";
integer i;
default {
    state_entry() {
        llSetText("Touch ME!",<1,1,1>,0.5);
        i = 0;
        // select the first notecard in the object's inventory
        gName = llGetInventoryName(INVENTORY_NOTECARD, 0);
        // request first line
        gQueryID = llGetNotecardLine(gName, gLine);
    }
    dataserver(key query_id, string data) {
        if (query_id == gQueryID) {
            if (data != EOF) { // not at the end of the notecard
            // llSay(0, (string)gLine+":"+data); // output the line
            urlList += [data];
            integer ListLength = llGetListLength(urlList);
            llSay(0, llList2String(urlList, ListLength - 1));
            // increase line count
            ++gLine;
            // request next line
            gQueryID = llGetNotecardLine(gName, gLine); }
    }
}
touch_start(integer nd){
    llParcelMediaCommandList([
        PARCEL_MEDIA_COMMAND_AGENT, llDetectedKey(0),
        PARCEL_MEDIA_COMMAND_PAUSE]);
    if (i >= (llGetListLength(urlList))) i = 0;
    llParcelMediaCommandList([
        PARCEL_MEDIA_COMMAND_AGENT, llDetectedKey(0),
        PARCEL_MEDIA_COMMAND_URL,llList2String(urlList,i),
        PARCEL_MEDIA_COMMAND_PLAY,
        PARCEL_MEDIA_COMMAND_LOOP,
        PARCEL_MEDIA_COMMAND_AUTO_ALIGN,TRUE]);
        ++i;
    }
}
///////////////////////////////////////////////////////////////////
Notecard はどんな名前でもいいので、こんな感じの内容です。(Appleサイトの映画予告のmovです)
http://movies.apple.com/movies/jp/movies/wb/oceans13/oceans13_480x211.mov
http://movies.apple.com/movies/jp/movies/buenavista/poc3/pirates3_trailer480x207.mov
http://movies.apple.com/movies/jp/movies/wb/blooddiamond/blooddiamond480x202.mov
http://movies.apple.com/movies/jp/movies/sony/media/legendofmexico_large_200409_01.mov
http://movies.apple.com/movies/jp/movies/sony/007casinoroyale/007.mov
http://movies.apple.com/movies/jp/movies/fox/x-menfinal/x-menfinal_trailer480.mov
http://movies.apple.com/movies/jp/movies/fox/media/irobot_large_20040818.mov
http://movies.apple.com/movies/jp/trailers/fox/fantastic_four/fantastic_four-jp_m480.mov
http://movies.apple.com/movies/jp/movies/fox/prada/prada_trailer480.mov
http://movies.apple.com/movies/jp/movies/wb/harry-potter/harrypotter_480x204.mov
http://movies.apple.com/movies/jp/movies/uip/transformer/transformer_trailer.mov
http://movies.apple.com/movies/jp/movies/wb/deathnote/deathnote_trailer480.mov
おもしろいのは、、、このスクリプトでは Land の Media URL は書き換わりません。
トランスフォーマーの予告movが入っているのに、パイレーツオブカリビアンが。。。
a動画4
これは、どうやら SL Viewer それぞれが、スクリプトによって Media texture の URL の値を一時的に保持しているみたいですね。つまり、QuickTime が読み込む先(URL)は「クライアント」がもっているみたい、、、ということですね。
実際、このオブジェクトを複数の人とクリックしあうと、、、それぞれが違う動画を見ることになりました。
ちなみに、これを Touch で URL を変えるのではなく、Touch で List からダイアログに表示して、そこのボタンから URL を変更する、、、にすると、Land の Media URL が書き換わって、かつ、Land 設定の Media の URL が書き換ったタイミングで、他の人がみている動画も変更されます。
うーん、Land の Media URL の書き換え条件って、ありそうですね~
なんか、、、応用ききそうw (でも、、、これが Bug だったら、、、使えませんね、、、もうちょっと調べてみる価値ありかも)
またまた、、、ニッチなネタで、ごめんなさい~w