- 締切済み
再生時間のbar
flv再生において、バーで再生時間の経過が分かるようにしたいのですが、外部flvで、スキンを使わずやりたいのですが、どなたか教えていただけないでしょうか?
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- DPE
- ベストアンサー率85% (666/776)
FLV に関しては、汎用的なものは作れないと思います。 この手のナビゲーションを作る時は、現在再生している位置(再生中の秒数)と全体の長さの情報が必要になります。 「全体がこの長さに対し、今再生しているのはここ」という情報を視覚的に表すものですから、当然ですよね。 この2つの情報があれば、全体に対する再生している位置の割合を算出して表示するだけなので、それほど難しいものではないと思います。 FLV では、今再生している位置は NetStream クラスの time プロパティに記録されているのですが、全体の長さを取得する確実な手段がありません。 動画ファイルにメタデータが書き込まれていれば、onMetaData というイベントハンドラを利用して取得できます。 ところが、このメタデータは FLV ファイルを作成したアプリケーションやエンコーダごとに書き込まれる情報と識別子の名前が異なるそうで、全体の長さがどのような識別子で記録されているのか、そもそも記録されているのかどうかすらもはっきりしません。 このあたりの仕様の統一が上手くいっていないためか、FLVPlayback コンポーネントでも全体の時間を保持する” totalTime ”がコンポーネントパラメータとして公開されていて、自分で設定できるようになっています。 ファイルのメタデータから全体の長さを取得できた場合は、その長さを元にバーを描画し、指定の場所をシークできるナビゲーションが付きます。 メタデータが取得できない場合は、totalTime パラメータに設定した値が採用されます。 デフォルトでは 0 になっていますから、ナビゲーション・バーは無効になります。 メタデータが書き込まれていない FLV ファイルでも、totalTime パラメータに何か値を入れておくと、その値を元にしてバーが描画されます。 ただし、コンポーネントではこの値が正しいかどうかは一切関知しないので、値が狂っているとシークが失敗したり、マーカーの位置が正しくなくなるなどの不具合の原因になります。 ----------------------------------------------------------------- 全体に対する割合からマーカーの位置を決めるナビゲーションの作り方は別の質問で紹介したことがありますので、よろしければご参照ください。 ・音楽再生中に表示するバー http://okwave.jp/kotaeru.php3?q=1628167 ↑これはサウンドの話で、再生中の位置は Sound クラスの position 、全体の長さは duration というプロパティを見て取得しています。 FLV の場合はこれらの値を取る方法が少々変わるだけで、バーのムービークリップやスクリプトの考え方は同じ発想で作れます。 FLV では全体の長さを取得する確実な方法がなく、汎用的かと言われれば疑問ではありますが、メタデータから取得できればそれを、取得できない時はとりあえず指定の長さを元にすることにします。 ステージに、ビデオインスタンス” flv_view ”とナビゲーション・バーのムービークリップ” navi ”があるとします。 navi の中には全体の長さを表すゲージのムービークリップ” bar ”(基準点は左端)とマーカーのムービークリップ” marker ”(基準点はゲージを指す部分)が含まれており、これらの基準点が全て親( navi )の基準点に配置されているものとします。 (ゲージの左端やマーカーが指す部分の座標の初期値を 0 として考えられるような配置にしておくということです) メタデータを取得するか、指定の値でナビゲーション・バーを表示するスクリプトは、次のようになります。 このスクリプトは、メインのタイムラインとムービークリップ” navi ”のインスタンスに設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください) ●フレームに設定するスクリプト //ローカル接続を確立 connect_obj = new NetConnection(); connect_obj.connect( null ); //ストリーミングの準備 stream_obj = new NetStream( connect_obj ); flv_view.attachVideo( stream_obj ); //メタデータを取得 stream_obj.onMetaData = function( meta:Object ) { //メタデータから全体の長さを取得 total_time = meta.duration; }; //動画の読み込み stream_obj.setBufferTime( 5 ); stream_obj.play( "***.flv" ); //再生ポジションナビゲータ用 total_time = 0; ●ムービークリップインスタンス”navi”に設定するスクリプト onClipEvent(enterFrame) { var pos; //全体の長さが取得できていれば、再生位置の割合を算出 if( _root.total_time != 0 ) { pos = _root.stream_obj.time / _root.total_time; //この割合の位置にマーカーを移動 marker._x = bar._width * pos; } } ************************** Flash Professional 8 に付属の Flash 8 Video Encoder で書き出した FLV であれば、メタデータに” duration ”という識別子で全体の長さが書き込まれます。 onMetaData で定義した処理はメタデータを取得できた時にだけ呼び出されますから、取得できない場合は変数 total_time の値は 0 のままです。 メタデータから全体の長さが取得できていないと思われる場合は、フレームのスクリプトの //再生ポジションナビゲータ用 total_time = 0; この部分を、FLV の全体の長さ(時間:単位は秒)に書き換えてください。 なお、Flash 8 Video Encoder で書き出したものでも、ローカルディスクに置いて再生させるとメタデータを取得できない場合があるようです。