Adsense

2009年2月13日金曜日

SLでの動画再生と YouTube のお話し その4

[2009.4.5 追記] YouTube もしくは pipes の仕様変更により現在この方法は有効ではないようです。ご注意ください。
[2009.4.8 追記] IE/Firefox といったブラウザから同様の仕組みの Javascript で現在でもダウンロードできることから、ユーザーエージェント判別によりアクセス規制しているような気がしますね~。pipes を使ったダウンロードは無効になるようです。
[2009.4.8 追記2] どうやらこういうことらしいです。。。

前回からの続きです。。。

このシリーズの一番最初の投稿に書いたように、「Second Life で YouTube」 は去年盛り上がった話しなので、話題としては古いのですが、昨年末あたりから Video 玉のスクリプトの書き換えをやってきて、かなり LSL のお勉強になったテーマでした。

Second Life の中から YouTube を検索、そして動画再生というスクリプト商品はすでに多く出ています。 ここの slmame でもすでに多くの商品が紹介されていますよね。Notecard に URL をリストするタイプも多いなか、今回の SnuVideo 玉のように検索機能をもったものもあります。 この前「うわ、すごい」と思ったスクリプト商品は検索結果を TV オブジェクトの画面に表示して、TV 上の画面にある観たい動画のサムネイルをクリックすると、それが再生される、、、という高機能とデザインの両面を重視したものでした。日本の方が作ったものでした。(あれこれ解説するのは野暮なので、、、でも、これはすごいです!)

外部 Web サーバー上で検索結果をリスト化して、再生するものだけの必要な処理を LSL 側で行う、、、は現実的な方法ですよね。

一方で私のように LSL での処理を多くしていくと必ず突き当たるのが、、、Stack/Heap エラーです。。。

Pipes を使って検索、ダウンロードまでが前回までのお話ですが、そのあとお友達に「もうだめかも、、、」とあきらめかけたのがメモリー対策でした。

Mono になってよかった~、なんて書いたことがあるのですが、たしかに使えるメモリーは以前より増えましたが、そのあと Linden の記事などを読むと、Mono 化は必ずしもメモリを増やすためだけではない、、、などという記事も見つけたりしていました。16KB から 64KB になったから 4 倍のメモリーが使えるようになった、、、という感覚ではいけない、ということです。(あー、その記事見つけれられないのでリンク貼れません、、、ごめんなさい。)

SnuVideo 玉では「ノートカードを使わない」ために「YouTubeの検索機能を使う」が初期のコンセプトでしたが、お友達にいろいろと使ってもらっているうちに、当初の YazMania ビデオ玉から完全に「YouTube 検索ビデオ玉」に使われ方が、、、変わりました。(笑

ユーザーさんが望むなら、それはそれで良しとして、、、

そうなると検索キーワードが「日本語」になり、動画のタイトルも日本語になっていく、、、
一度の検索で pipe のほうは最大 50 件まで結果をとれますが、比較的英語のタイトルが多かった Yaz Rockett 関連 / Second Life 関連のビデオを対象とするものから、日本語のタイトルが多くなる動画検索の使われ方に変わることで2つの問題がでました。

 0
文字数ではなくバイト数で動画タイトルの長さを制限したダイアログ

その1つが以前の投稿の「ダイアログの制限文字数(バイト数)を超える」でした。 これはあきらめるほどのものではなかったのですが、もうひとつは、検索するキーワードによっては、検索結果の動画情報を取り込んでいる途中でメモリが足りなくなって Stack/Heap エラーによりスクリプトがご臨終、、、というものでした。

メモリー対策、最後はスクリプトの分割

もう、、、サブタイトルの通りです。
検索キーワードによる検索結果で日本語に代表される 1 文字 3 バイトの UTF-8 が大量にくるようになると、ビデオタイトルといった文字を格納するリスト、文字をリストに保持するために使用したり、上述のバイト数を調べるために使う Heap のエリアが、アルファニューメリック(英数字)の環境よりもより多く必要になるのは、、、もう仕方ないですね。

十分なメモリー領域を確保するために、エラーメッセージや、通常のメッセージに使われる日本語ストリングのメモリーエリア節約のためメッセージ系の処理を別スクリプトにして、llMessageLinked を使って番号で表示させたいメッセージを指定して、別にしたスクリプトから日本語メッセージを表示させたりするところからはじまって、最大検索件数を 50 から 27 まで減らしたり(これについてはあまりネガティブな意見はなく、、、ダイアログで検索結果が見られるとはいえ、50件ってやっぱり使っている人のとっては多いとのご意見でした、、、) 最終的には llHTTPRequest と http_response のコアの検索処理とダイアログボタン作成の部分を別のスクリプトとして独立させることになりました。
最初 1つのスクリプトしか玉の中になかったのですが、今は、、、4つのスクリプトが!(笑

この時、面白いことに気がつきました。
llHTTPRequest に対する http_response イベントですが、これ、スクリプトに対するイベントではなく、オブジェクトに対するイベントになっているようですね。
その2の追記にちょっと書いたのですが、私の llHTTPRequest の書き方は、基本的には key を list にいれる方法をとっていました。
llListFindList でチェックし、リクエストした key に対する response を処理をしていたので最初気がつかなかったのですが、同じオブジェクトの中のスクリプトは、他のスクリプトがおこした llHTTPRequest の http_response を受け取ることができます。
気をつけないといけない反面、なんかスクリプトテクニックとしては使えそうです。

これで、、、今のところメモリーの問題はクリアしたようで、いろいろとお友達に検索してもらっていますが、残り 12K とか、、、、なっています。Stack/Heap エラーは出なくなりました。
で、、、完成した?
実は、まだ悩んでいるのが 1つだけあるんです。。。
え、またその話しにもどるの?的な、、、ことなんですが。まだ、続くでw