• 締切済み

FLVPlaybackのcontentpathを外部入力する方法

こんにちは。 FLVPlaybackを用いて、FLVを再生しようと考えています。 その際に、FLVのファイル名を外部テキストから、入力したい と考えています。 FLVはFMSにあり、FLVPlaybackのインスペクタ内のcontentpathに 下記で設定しているパスとファイル名を入力すると、正常に 再生されますので、パスは問題ないと思われます。 トレースの結果、my_urlは、video.flvの呼び出しは成功しています。 ただ、contentpathをトレースすると、 rtmp://****/test/undefinedとなります。 ということは、 + my_url; にファイル名がわたってないように思います。 記述がおかしいのでしょうか? ご教授いただければ幸いです。 FLVPlaybackのインスタンス・・・flvPlayer 外部テキストファイル名・・・my_url.txt 外部テキスト内部・・・my_url=video.flv my_url = new LoadVars(); my_url.load("my_url.txt"); my_url.onLoad = myFunction; function myFunction(bSuccess) { if (bSuccess) { trace(this.my_url); flvPlayer.contentPath= "rtmp://****/test/" + my_url; trace("rtmp://****/test/" +my_url.contentPath ); } else { trace("受信失敗"); } } my_url.load("my_url.txt");

みんなの回答

  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

LoadVars クラスで読み込んだ変数を参照する方法と、trace アクションで見ている変数のターゲットパスに誤りがあると思われます。 また、読み込み用に作った LoadVars クラスのオブジェクトの名前と読み込まれる変数の名前が同名であるために、ややこしいことになっています。 LoadVars.load で読み込んだ変数は、読み込みに使った LoadVars オブジェクトのものになっています。 ” my_url ”というオブジェクトで読み込んだのなら、参照する時は  my_url.読み込んだ変数名 です。 ActionScript では、参照しようとする変数や関数・インスタンスなどがどの階層のものになっているかを正確に指定しなければならない決まりがあります。 階層の指定のことを”ターゲットパス”といいます。 ターゲットパスにはいろいろな書き方があり、自分の階層であれば省略して書くこともできます。 ただし、省略した書き方には少々クセがありますので注意が必要です。 関数内でターゲットパスを省略すると、”関数が定義されている階層”のことを指します。 例えば、ご提示のスクリプトがメインのタイムラインのフレームに書かれていて、この swf ファイルが他のムービーに読み込まれることがないとしますと、関数 myFunction 内の  flvPlayer.contentPath= "rtmp://****/test/" + my_url; ↑この記述は、flvPlayer も my_url も _root にあるもの、と解釈されます。 外部テキストファイルから読み込んだ変数は _root のものではなく、” _root にある LoadVars オブジェクト my_url のもの”になっているのですから、この書き方では読み込んだ変数を参照できません。 ターゲットパスを書く時に、相対的な表現である this というキーワードを使うこともできます。 this はその意味の通り”この”、つまり自分自身のものを指す表現ですが、使う場所によって”自分自身”が誰であるかが変わってしまうというクセモノです。 onLoad などのイベントハンドラに登録される関数内では、this は関数が定義されている階層のことではなく、”イベントハンドラの持ち主”を指します。 関数 myFunction が LoadVars オブジェクトである my_url の持っている onLoad イベントハンドラにより呼び出される場合は、関数内の this は my_url のことを指します。 ですから、myFunction 内で  trace( this.my_url ); とした時は、” LoadVars オブジェクトである my_url に読み込まれた変数 my_url ”ということで、今回の件ですと” video.flv ”という文字列が表示されるはずです。 ところが、その下にある  flvPlayer.contentPath= "rtmp://****/test/" + my_url; では、 my_url の前に this が抜けています。 ターゲットパスを省略した時は関数が定義されている階層が持っている my_url を指すため、contentPath に正しいファイル名が渡りません。 ちなみに、ご提示のスクリプトの myFunction 内で  trace( my_url ); を実行してみると、  my%5Furl=video%2Eflv&onLoad=%5Btype%20Function%5D ↑このような文字列が表示されるかと思います。 これは何かと言いますと、読み込みに使った LoadVars オブジェクトである my_url の中身です。 ご提示のスクリプトではこのような文字列が URL に連結されてしまうために、flv ファイルへのアクセスも失敗となります。 ************************** それから、コンポーネントの contentPath プロパティの内容を調べるなら、  trace( flvPlayer.contentPath ); というようにした方が確実です。 my_url に contentPath という変数はありません(未定義= undefined になっている)から、  trace("rtmp://****/test/" +my_url.contentPath ); では、読み込みの成功・失敗に関係なく、必ず rtmp://****/test/undefined と表示されてしまいます。 --------------------------------------------------------------- LoadVars オブジェクトの名前と読み込む変数の名前が同じであっても、ターゲットパスの書き方さえ間違えなければ正しく参照できますし、実は文法上も別に問題はありません。 しかし、全く同じ名前ですとやはり紛らわしいので、どちらかを別の名前にした方が無難です。 以上の点をふまえてスクリプトにしてみますと、大体、次のようになります。 ステージに FLVPlayback コンポーネントのインスタンス” flvPlayer ”があるとします。 このスクリプトは、メインのタイムラインのフレームに設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)  //オブジェクトの作成  load_obj = new LoadVars();  //読み込み終了時に呼び出される関数の定義とイベントの登録  function myFunction( bSuccess )  {   //読み込みに成功したら、ビデオのURLを設定   if( bSuccess )   {    flvPlayer.contentPath = "rtmp://****/test/" + this.my_url;    //URLのチェック    trace( flvPlayer.contentPath );   }   else   {    trace( "受信失敗" );   }  }  load_obj.onLoad = myFunction;  //外部テキストファイルの読み込み  load_obj.load( "my_url.txt" ); LoadVars のオブジェクト名は” load_obj ”という名前に変更させていただきました。 関数 myFunction が load_obj の onLoad イベントハンドラにより呼び出される時には、この関数内の this は load_obj のことを指します。 従って、  flvPlayer.contentPath = "rtmp://****/test/" + this.my_url; は、” load_obj のものになっている変数 my_url と文字列を連結した結果を flvPlayer が持っている contentPath に代入する”という意味になります。 ストリーミング配信環境がないためストリーミング再生のことはよく分かりませんが、contentPath に URL が正確に指定されていれば FLV も正常に再生されると思います。

tsuyoshi28
質問者

お礼

有難うございます。 非常に丁寧に教えて頂いたおかげで、 理解し、無事に稼動いたしました。 本当に助かりましたー! 有難うございます。

すると、全ての回答が全文表示されます。