Flash CCを使ったビデオ再生などについて、忘れないうちに。
動画ファイル(H.264のmp4など)をアクションスクリプト (AS3.0)で制御して、再生できるようにしました。プロジェクタを作成して実行ファイル(exe)にして、ローカルなスタンドアローン・アプリケーションとして利用できます。
通常、WebブラウザにFlashPlayerとして組み込まれることが多いFLashですが、ローカルなアプリケーションを作ることもできます。ゲームを作ったり、最近ではFlashを使ったアニメもありますね。
Directorでも同様のことができますが、持っていないので、Flashで挑戦しています。アクションスクリプト使うのは今日が初めてですが、苦労しながらなんとかできました。
●ビデオ再生に必要なコンポーネント FLVPlayback
ビデオクリップを再生するには、FLVPlaybackを使用します。通常、ネットワーク上にあるファイルをストリーミング再生するのに利用されることが多いようですが、ローカルPC内にある動画ファイルを再生することもできます。この時使用されるコンポーネントがFLVPlaybackです。
Flashで、適当なレイヤを作成してステージ上へローカルディスク上の動画ファイル(mp4など)をドラッグ&ドロップすると、自動的にFLVPlaybackが生成されます。プログラム上でコンストラクタを呼びだして初期化してもかまいませんが、レイアウト調整もあるので、先に動画をロードしておきます。
途中、いくつかダイアログボックスが表示されて、動画ファイルの場所やスキンの指定ができます。通常は、プレイや停止ボタンの付いたスキンを指定すると、その操作についてはプログラム不要ですが、今回はすべてプログラムで制御するために、スキンは「なし」に設定します。これで、ボタン類が一切ついていない動画の初期画面がステージ上に配置されます。
その後にプロパティペインでインスタンス名を指定します。これ以降、スクリプト上からこの動画にアクセスできるようになります。仮に”mov1″という名前にしておきます。
●操作メソッド
スクリプト上からは、FLVPlaybackのメソッドを使ってムービを操作できます。基本的な操作メソッドを示します。
- play() :動画を再生。 例) mov1.play();
- pause(): 一時停止。 例) mov1.pause();
- stop() :停止。 例) mov1.stop();
●プロパティ
- autoRewind:停止時に自動的に巻き戻し。 例) mov1.autoRewind = true;
- autoPlay:アクティブになった時にすぐに再生を始める。 例) mov1.autoPlay = false;
- source: 動画ファイルのパス。ローカル上のファイルパスを設定できるほか、リモートファイルのURLを指定することもできる。
ローカルファイルの例) mov1.source = “D:¥¥contents¥¥movie.mp4″;(¥は半角) - activeVideoPlayerIndex:アクティブな動画ファイルのインデックス
- visibleVideoPlayerIndex:表示対象の動画ファイルのインデックス
activeVideoPlayerIndex、visibleVideoPlayerIndexは複数の動画を切り替えて操作するとにに使用します。1つのクリップの場合は使いません。複数登録する場合も最初のファイルは、どちらのプロパティも自動で”0″に設定されます。
●イベントリスナ ファイル再生完了など
再生が完了したタイミングを知りたいときがあります。そのときはイベントを利用してハンドリングさせます。
今回は再生が終わったタイミングを使いたかったので、completeというイベントを使いました。
イベントを利用するときは、”fl.video“パッケージを利用するためにそれをインポートしておきます。
import fl.video.VideoEvent; // このイベントのみ
または
inport fl.video.*; // 他のイベントも含めてすべて
_
次にイベントリスナを登録します。イベント名は
“VideoEvent“ではなく、”fl.video.VideoEvent“です。”COMPLETE“というのはイベントのタイプで”READY”などほかにもいろいろあります。
mov1.addEventListener( fl.video.VideoEvent.COMPLETE, onMovieEnd);
_
更にイベントハンドラ(実行が終わった後に実行される関数)は次のようにします。関数名は”onMovieEnd”としています。
function onMovieEnd(evt:fl.video.VideoEvent):void { // 再生が終わったときに実行する処理 }
これで、再生が終わったら指定の処理ができるようになります。
まとめて書くと該当部分は次のようになります。
import fl.video.VideoEvent; // このイベントのみ // イベントリスナ登録 mov1.addEventListener( fl.video.VideoEvent.COMPLETE, onMovieEnd); // イベントハンドラ function onMovieEnd(evt:fl.video.VideoEvent):void { // 再生が終わったときに実行する処理 }
最初、イベントリスナの登録がわからずに苦労しました。Adobeのサイトや他のところを見てもイベントの部分が”VideoEvent.COMPLETE”となっていて、そのようにするとコンパイルエラーで動きません。
“fl.video.”というのを付けないと、他にも同名のイベントがあるようで、そちらが参照されていたみたいです。最初に”fl.video.”をつけて試していたはずなんですが、どこか違っていたいようで、いろいろ調べました。大文字小文字がいろいろ混じっているのでスペルミスしていたんでしょう。結局この書き方で解決しました。