映画のエンドロール観る派?観ない派?

flvファイルを外部読み込みにし、エンドレス再生を試みました。

_root.onEnterFrame = function(){
if(mediacomponent.playheadTime >= mediacomponent.totalTime){

mediacomponent.stop();//停止
mediacomponent.play();//再生
}
}

とasフレームに書き込みました。
スムーズに連続再生される時もあるんですが、
3分くらい一時停止した後に再生されるときもあります。

1回の再生終了後、スリープ数秒の記述を入れれば、
うまく連続再生できるのでしょうか?
だとしても、その記述の仕方がわかりません。

あと、fiv外部読み込みにする前はフレーム読み込みで連続再生
を試みたのですが、速度がオリジナルよりだいぶ遅くなり断念しました。

その際、NowLoading設定していたのは効いていたんですが、
flv読み込みに変更した後からは効いていないようです。
3フレーム目にムービーが読み込まれているので、

if (_framesloaded>3) {
gotoAndPlay(3);
} else {
gotoAndPlay(1);
}

と記述しています。



●flv外部読み込みで安定した連続再生の方法
●flv外部読み込みでNowLoadingを有効にする方法

おわかりの方、お知恵をお貸しください。

A 回答 (1件)

FLV を再生するには、swf ファイルに埋め込む方法(埋め込みビデオ)と、swf ファイルの外に flv ファイルを置いて動的に読み込む方法があります。



外部から読み込む再生方法は更に、ハードディスクに記録されるプログレッシブ再生とメモリに読み込まれるストリーミング再生の2種類に分かれますが、ストリーミング再生はサーバーとの連携が必要ですのでここでは扱いません。


埋め込みビデオは、swf ファイルのタイムラインに合わせて動画の各コマが展開されます。
早い話が動画から作られるフレームアニメのようなものですから、巻き戻しや早送り・再生・停止はフレームを切り替える要領で gotoAndPlay 等の簡単なスクリプトで、Now Loading も普通の Flash ムービーと同じ技法で作れます。

ただし、フレームアニメになるということは、swf ファイルのフレームレートに従って再生されるということです。
動画は 20 fps や 30 fps といった高いレートで作られている場合も多く、Flash ムービーの標準とされる 12 ~ 15 fps で作った swf ファイルに埋め込むと再生が遅くなったり動きが粗くなるなどの現象が起きます。
フレームレートの件は swf ファイルと FLV のフレームレートを合わせると解決できますが、20 fps を超える高いレートの swf ファイルは再生するマシンに多大な負担をかけますし、埋め込みビデオは swf ファイル自体の容量が大きくなりがちで処理が追いつかず動作が遅くなることがあり、長い動画を扱うには向かない方法です。


この難点を解決するために開発されたのが、FLV という規格と swf ファイルの外に置いたまま再生する方法です。
外部 FLV を読み込む方法は動画を独立させて再生させているようなもので、swf ファイルのフレームレートに引きずられることなく再生できる利点があります。
しかし、外部 FLV の再生は swf ファイルのタイムラインやムービークリップとは違う仕組みになっているため、gotoAndPlay などのおなじみのスクリプトでは制御できません。
再生する箇所の指定・読み込み完了率の取得などには、FLV を制御する専用のスクリプトを使います。

-----------------------------------------------------------------

ご提示のスクリプトから察するに、MediaPlayback コンポーネント( Flash Player 6 および 7 向けの FLV 再生用コンポーネント)をご利用だと思います。


ループ再生は、flv ファイルの最後が再生された時にコンポーネントから発行される complete というイベントを利用すると簡単です。

ループ再生とは要するに、最後まで再生されたら先頭まで巻き戻して再生することです。
再生する位置は playheadTime プロパティで管理されており、動画の最初は 0 秒です。
つまり、complete イベント発生時に playheadTime プロパティに 0 を入れて先頭まで巻き戻して play メソッドで再生することで、ループ再生になります。


ステージに、MediaPlayback コンポーネントのインスタンス” mediacomponent ”があるとします。
このインスタンスでループ再生にするスクリプトは、次のようになります。
このスクリプトはフレームに設定してください。

(↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)



 //リスナーオブジェクトを作成
 flv_listener = new Object();

 //再生終了時に、自動的にループ
 flv_listener.complete = function()
 {
  //再生ヘッドを先頭に戻す
  mediacomponent.playheadTime = 0;

  //動画を再生
  mediacomponent.play();
 };

 //リスナーオブジェクトを登録
 mediacomponent.addEventListener( "complete" , flv_listener );

-----------------------------------------------------------------

Flash MX 2004 からは、頒布用のコンポーネントのファイルフォーマットとして SWC ( Flash コンポーネントファイル)という形式が登場しました。
MX 2004 や Flash 8 に付属のコンポーネントも、殆どがこの形式で作られています。

SWC ファイルで作られているコンポーネントは、リンケージを利用して swf ファイルに組み込まれます。
デフォルトではフレーム1に書き出されるように設定されていますので、コンポーネントを多数利用するとフレーム1の容量が大きくなり、続く Now Loading アニメがなかなか始まらなくなってしまいます。

MediaPlayback コンポーネントの容量は 70 KB 弱で、今時の高速回線ならあまり心配はない大きさですが、気になるようでしたら次の要領で書き出すフレームを変更できます。


まず、リンケージの設定を変更します。
「ライブラリ」パネルにある MediaPlayback コンポーネントのシンボルを選んだ状態で、右クリック( Mac では control +クリック)で出すメニューから「リンケージ...」を選択してください。「リンケージプロパティ」パネルが開きます。
「リンケージ:」のところに、”最初のフレームに書き出し”という項目があります。
チェックが入っていますので、外してください。

Flash に最初から付いているコンポーネントの多くは、専用のクラスが関連付けられています。
MediaPlayback コンポーネントには” MediaPlayback ”というクラスが関連付けられています。
実は、MediaPlayback シンボルの容量は MediaPlayback クラスを定義するためのスクリプトが大半を占めており、リンケージの設定を変更しただけではフレーム1の容量はあまり軽くなりません。

そこで、クラス定義をフレーム1以外のフレームで行うように変更します。
「パブリッシュ設定」(「ファイル」メニュー内、もしくは「プロパティ」パネルの「パブリッシュ:設定」ボタン)で” Flash ”のタブを選択してください。
「 ActionScript のバージョン:」の項目で” ActionScript 2.0 ”を選び、隣にある「設定」ボタンを押してください。「 ActionScript 設定」パネルが開きます。
上の方に「クラス用のフレームの書き出し:」という項目があります。
ここに、MediaPlayback コンポーネントのインスタンスが初めてステージに登場するフレームを入力してください。
例えば、フレーム3に配置しているのであれば 3 を入力します。


ここまでの操作で、コンポーネントシンボルがフレーム1以外のフレームに書き出されるようになります。
あとは普通の Now Loading の作り方と同じです。

*********************************

ムービー本体ではなく FLV の Now Loading を入れたいとのことですと、もう少し工夫が必要になります。


MediaPlayback コンポーネントで再生する FLV の容量に関する情報は、コンポーネントが持っている bytesTotal と bytesLoaded プロパティに保存されています。
完了率の算出方法はムービーの Now Loading と同じなのですが、動画が読み込まれるまで再生しないようにする処理が普通の Now Loading とは異なります。

簡単なのは、MediaPlayback のインスタンス全体を非表示にしておき、読み込みが完了したら表示する方法だと思います。
ただ、読み込みの間は見えないだけで再生は進んでしまっていますので、表示する前に先頭に巻き戻すようにします。
巻き戻しの処理はループ再生で使ったものと同じです。

音声が入っている動画の場合は、予めボリュームを絞っておいて、読み込み完了後に元のボリュームに戻すことで何とかなります。
MediaPlayback コンポーネントでは、ボリュームは volume というプロパティを通じて操作できます。


FLV の容量を取得するために見るプロパティがムービーと違うこともありますが、何より、コンポーネントで読み込みが始まるまでは FLV の情報が判明しないので、ムービーと動画の合算で Now Loading を作るのは難しいです。
それよりも、ムービー全体の Now Loading を作ってコンポーネント等のインターフェイスの読み込み完了を待ってから先に進み、改めて FLV だけの Now Loading を作るようにした方が簡単だと思います。
実際に、メインとなるインターフェイス部分の読み込みと、後で再生する動画や音楽等の読み込みが分かれていて、読み込み中のアニメが別々に表示される作品はしばしば見かけるものです。

*********************************

ムービーの構成は次のように考えます。


 フレーム1:ムービーの読み込み完了を待つフレーム。スクリプトはなし。
 フレーム2:ムービーの読み込み完了を待って先に進む。
 フレーム3:普段はここで動画を再生する。動画は完全に読み込まれるまで再生しない。


読み込み中に表示するアニメは、ムービー全体用と FLV 用の2種類を用意してください。シンボルにして同じものを使いまわしても構いませんが、インスタンス名は別の名前を付けた方が無難です。
ムービー用はフレーム1からフレーム2まで、FLV 用はフレーム3に配置します。
ここでは仮に、前者のインスタンス名を” prog_bar ”、後者のインスタンス名を” flv_prog_bar ”とします。


ムービー全体の読み込み完了を待ち、続けて MediaPlayback コンポーネントのインスタンス” mediacomponent ”で再生する FLV が全て読み込まれるまで待つスクリプトは、次のようになります。

スクリプトはフレーム2と3に書きます。
なお、先述のループ再生のスクリプトはフレーム3にまとめることができます。

(↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)


 ●フレーム2のスクリプト

  //ムービー本体の読み込み完了率を算出
  loaded = _root.getBytesLoaded();
  total = _root.getBytesTotal();
  per = Math.floor( loaded / total * 100 );

  //プログレスバーの描画と読み込み完了待ち
  if( per < 100 )
  {
   prog_bar._xscale = per;
   gotoAndPlay( _currentframe - 1 );
  }
  //読み込みが完了したら、次のフレームでタイムラインを止める
  else
  {
   nextFrame();
  }



 ●フレーム3のスクリプト

  /////////////////////////////////////////////////////////
  //メディアコンポーネントの初期設定
  /////////////////////////////////////////////////////////

  //コンポーネントを非表示にし、ミュート(消音)にする
  mediacomponent._visible = false;
  mediacomponent.volume = 0;


  /////////////////////////////////////////////////////////
  //ループ再生に関する処理
  /////////////////////////////////////////////////////////

  /*ここに、completeイベントを使ったループ再生の処理を書く*/


  /////////////////////////////////////////////////////////
  //FLVのプリロード
  /////////////////////////////////////////////////////////

  _root.onEnterFrame = function()
  {
   var flv_total:Number , flv_loaded:Number , flv_per:Number;


   //FLVの読み込み完了を待つ
   //FLVの読み込みが始まらないうちは何もしない
   flv_total = mediacomponent.bytesTotal;
   if( flv_total != undefined )
   {
    //読み込み完了率を算出
    flv_loaded = mediacomponent.bytesLoaded;
    flv_per = Math.floor( flv_loaded / flv_total * 100 );

    //プログレスバーの描画
    flv_prog_bar._xscale = flv_per;

    //100%読み込まれたら、プログレスバーを消して動画を再生
    if( flv_per >= 100 )
    {
     //プログレスバーを消す
     flv_prog_bar._visible = false;

     //コンポーネントを表示し、ミュートを解除
     mediacomponent._visible = true;
     mediacomponent.volume = 100;

     //再生ヘッドを先頭に戻して再生
     mediacomponent.playheadTime = 0;
     mediacomponent.play();

     //enterFrameイベント処理を削除
     delete _root.onEnterFrame;
    }
   }
  };



フレーム2のスクリプトは、よくある Now Loading の作り方と同じものです。
変数 per に完了率が%で入りますので、ダイナミックテキストで Now Loading ○%といった表示にも利用できます。

ムービー自体の読み込みが済んだ後、フレーム3のスクリプトにより、続けて FLV の Now Loading が始まります。
こちらは、変数 flv_per に完了率が同じく%で入ります。
読み込み中に表示するアニメなどは、作品に合わせて適宜変更してください。


長くなってすみませんでした。
不明な点がありましたら、補足してください。
    • good
    • 0
この回答へのお礼

とても詳しく、ご丁寧なご指導を本当にありがとうございます。
お礼が遅くなってしまい、申し訳ありません。
安定したムービー再生が可能となりました。
埋め込んだ時に遅くて「NowLoadingが必要」だったのですが、スムーズに流れ出したのでもしかしたら今回はつけなくて大丈夫かもしれません。
ですが、とても丁寧なご解答を頂いているので後に必ずチャレンジさせて頂きます!
本当にありがとうございました!

お礼日時:2006/12/21 11:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!