AIRやFLASHなどを表示するのに不便なので、ブログから自作サイトに移転します。

N2-Works移転先

今後はこちらで更新を行っていきます。


FLVPlayer制作第4回はMetaDataについてです。


FLVファイルには、その動画の情報を記載するMetaData領域が存在します。

といっても全てのFLVファイルにMetaDataが存在するわけではなく、あくまでその動画を作成した人が任意で挿入するものです。


MetaDataを動画作成の後に挿入したり、更新したりできるフリーソフトもあるようなので、興味のある方は試してみていかがでしょうか?


さて、今回なぜこのMetaDataが話題になっているかというと、動画のシーク機能に必要だからです。シークバーを使用して実現しますが、実際には次の画像のようなものです。


N2-Works-シークバー


赤い円のインスタンスをシークスイッチと呼ぶことにしますが、そのシークスイッチをドラッグ&ドロップすることによって、動画を任意の再生時間へスキップできる機能です。


このシークバーの幅が動画の再生時間を表しており、左端が0秒位置、右端が最終秒位置となります。つまり動画の総再生時間が事前に分かっていないと、シークスイッチの位置が動画のどの再生位置なのか分かりません。


前回の『FLV動画の再生 』で動画の再生方法を記しましたが、少なくともNetStream.playメソッドが実行される前には総再生時間を取得しておく必要があります。


その総再生時間ですが、前述したMetaDataで取得することができます。


MetaDataの取得方法は、再生対象のFLVファイルにMetaDataが含まれている場合のみコールされるコールバック関数「onMetaData」を使用して行います。


コールバックが起こるタイミングはテストしてみた結果、stream.play実行後、バッファが溜まるまでの間に発生すると思われます。


onMetaDataはイベントハンドラ関数と異なり、addEventListenerを使用して設定を行わず、コールバック先を指定し、その指定先(クラス)にコールバック関数「onMetaData」を自分で定義し、その中に処理を書きます。

具体的には以下のようなコードになります。

// コネクションのコールバック先を自分自身に設定
stream.client = this;

// コールバック関数定義
public function onMetaData(info:Object) : void
{
    // MetaDataをtraceして確認
    for (var ite:String in info) {
        trace(ite + " : " + info[ite]);
    }
}


コールバック関数定義で注意すべき点は、クラスの可視性をpublicレベルに、そして関数名をonMetaDataにしておくことです。そして引数Objectの中にMetaDataの中身が挿入されていますので、その値を利用します。上記のコードでその動画のMetaDataを全てtraceできますので一度確認してみて下さい。


その確認できるデータの中に「duration」というプロパティが存在すれば、それがその動画の総再生時間となります。値を見ていただければ分かりますが、int形式ではなくNumber形式で格納されていますので注意が必要です。単位は(秒)です。


ここまで読んでこられて次のような疑問をもたれた方もいるでしょう。

「MetaDataが存在しない場合はどうするのか」

「MetaDataが存在してもdurationプロパティが設定されていない場合はどうするのか」


実はFLVファイルの総再生時間を知る術は、上記のやり方以外、少なくともActionScript3.0で提供しているメソッドの中には存在しません。


NetStreamクラスのメソッドの中には動画の総バイト数を取得できるメソッドや、バッファリングしたバイト数などを取得できるものはありますが、総再生時間を算出する次のような式を満たすデータを全て取得することができないのです。


[総再生時間の算出式]
総再生時間 = (動画の総バイト数 * 8) / 1秒毎のbitrate(bit per second)


色々と調査してみましたがbpsを取得できるメソッドは存在しませんでした。

ではdurationが取得できない場合、シーク機能は利用できないのでしょうか。


効率を無視すればできないことはありません。

つまり、一度動画を全て再生すれば動画を再生し終えた時のイベントリスナーで、その時点の再生秒を取得することができます。


ただ、このやり方ですと100分ある動画ですと、総再生時間を取得できる時には100分経過していることになります。これではとても実用的とは言えません。


実はかなり強引なやり方ですが、この問題を解消する方法があります。

次回はそのやり方を書くことにしましょう。