トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     flv制御について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
みみみぃ
Åê¹ÆNo.36330
投稿日時: 2007-11-18 18:27
新米
居住地: 埼玉県
投稿: 10
使用環境:
WinXP,Flash8
flv制御について
こんばんわ、お世話になります。
初めて質問させていただきます。

現在flashで外部flvを読み込み、シークバーによって再生位置を制御する、という動作をやりたいのですが、上手くいきません。

流れとしては、以下のようになります。


●FLVを読み込む、以下のソースの用に読み込んでます。

flv01 = "01.flv";

//ローカル接続を確立
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(this.flv01);


●シークバーを作成する、seekというMCの中にbarというMCとmarkerというMCをそれぞれ作って配置しています。全体の長さと現在の再生時間に合わせてmarkerが横に動いていく、という仕組みです。

onClipEvent(enterFrame)
{
var pos;
marker._x = 0;
if( _root.total_time != 0 )
{
pos = _root.stream_obj.time /_root.total_time;
marker._x = bar._width * pos;
}
}


これで一応動作はするんですが、加えてmarkerをクリックしてx軸移動させた時に対応する座標によってflvの再生時間を設定したいのですが、上手くいきません・・・。
(やりたいことはyoutubeのようなシークバーです)

解決法をお分かりになる方ご教授お願いします・・・。

開発環境:WinXP Flash8Professional
確認環境:WinXP
あにぃ
Åê¹ÆNo.36337
投稿日時: 2007-11-19 12:04
職人
居住地: 北海道
投稿: 250
使用環境:
Flash8
FlashCS3
WinXP
FlashLite1.1 / 2.0
Re: flv制御について
引用:
これで一応動作はするんですが、加えてmarkerをクリックしてx軸移動させた時に対応する座標によってflvの再生時間を設定したいのですが、上手くいきません・・・。


なにがうまくいかないのでしょうか?
・markerをクリックしてx軸移動させられない。
・対応する座標によってflvの再生時間を設定できない。
どちらですか?

・markerをクリックしてx軸移動させられない。
_xmouseを駆使してみましょう。



・対応する座標によってflvの再生時間を設定できない。
connect_obj.seek(n);//nには秒数


----------------
質問する際には、ご自分でできる限り調べてから投稿して下さい

P・S 職人おめでとう。(08/10/09)

みみみぃ
Åê¹ÆNo.36342
投稿日時: 2007-11-19 14:38
新米
居住地: 埼玉県
投稿: 10
使用環境:
WinXP,Flash8
Re: flv制御について
わかりづらい質問で申し訳ありません、もう少し詳細に書くべきでした・・・。

今やりたいことは

markerをクリックした時(on press)にflvの再生を一時停止

クリック時だけmarkerを横に移動出来るようにする

markerを離した時(on release)にそのx軸の位置によってflvの再生時間を設定する

です。

昨日、少しソースを付け加えましてmarkerのMCに

on (press) {
_root.stream_obj.pause();
this.startDrag(false, 0, 0, 133, 0);
_root.marker = false;
}

on (release, releaseOutside) {
this.stopDrag();
_root.marker = true;
_root.stream_obj.play();
}

onClipEvent (enterFrame) {
_root.stream_obj.seek(_root.stream_obj.time = this._x);
}

onClipEvent (mouseMove) {
updateAfterEvent();
}

seekのMCに

onClipEvent(enterFrame) {
if(_root.marker){
var pos;
marker._x = 0;
if( _root.total_time != 0 ) {
pos = _root.stream_obj.time /_root.total_time;
marker._x = bar._width * pos;
marker = marker._x
}
}
}

を、それぞれ追記しました。

markerは押された時にflvを停止し、0?133の間でドラッグを可能にして、markerフラグをfalseにする処理を(markerフラグはフラグがfalseの時にseekの動きを停止しています)、markerを離した時にmarkerフラグをtrueにし、flvを再生させる処理付け加えました。

そしてMCを読み込むたびに動画をmarkerのx軸に対応させた位置から再生したいのですが、markerを離した時にその位置から再生されず、seekに設定してある自動でmarkerが動く動作も働かなくなってしまいました。

何度試しても正常に動作してくれません。
seekに設定してある、markerを再生時間に合わせて動かすというコードがおかしいのでしょうか・・・。

引き続きよろしくお願いします。
あにぃ
Åê¹ÆNo.36344
投稿日時: 2007-11-19 15:19
職人
居住地: 北海道
投稿: 250
使用環境:
Flash8
FlashCS3
WinXP
FlashLite1.1 / 2.0
Re: flv制御について
seekに入る値は0~133のようですが、flvはかならず133秒のものしか再生されないということでよろしいでしょうか?



marker
onClipEvent (enterFrame) {
    _root.stream_obj.seek(_root.stream_obj.time = this._x);
}

seek
onClipEvent(enterFrame) {
    if(_root.marker){
        var pos;
        marker._x = 0;
        if( _root.total_time != 0 ) {
            pos = _root.stream_obj.time /_root.total_time;
            marker._x = bar._width * pos;
            marker = marker._x
        }
    }
}

seekのenterFrameでは再生時間でmarkerの位置を変更し、
markerのenterFrameではmarkerの位置で再生時間を変更する。
お互いがお互いをけん制しあっているため、動きませんね。


on (press) {
    _root.stream_obj.pause();
    this.startDrag(false, 0, 0, 133, 0);
    _root.marker = false;
}
on (release, releaseOutside) {
    this.stopDrag();
    _root.stream_obj.seek(_root.stream_obj.time = this._x);
}

onClipEvent (mouseMove) {
    updateAfterEvent();
}

seekのMCに

onClipEvent(enterFrame) {
    if(_root.marker){
        var pos;
        marker._x = 0;
        if( _root.total_time != 0 ) {
            pos = _root.stream_obj.time /_root.total_time;
            marker._x = bar._width * pos;
            marker = marker._x
        }
    }
}

とし、release時のみseekさせてみてはいかがでしょうか?

あと、_root.markerをtrueおよび、再生開始にするタイミングは、シーク処理が終わった後のほうがいいかと思います。

stream_obj.onStatus = function(infoObject:Object):Void  {
  if (infoObject.code == "NetStream.Seek.Notify") {
    _root.marker = true;
    _root.stream_obj.play();
  }
}


----------------
質問する際には、ご自分でできる限り調べてから投稿して下さい

P・S 職人おめでとう。(08/10/09)

みみみぃ
Åê¹ÆNo.36371
投稿日時: 2007-11-20 14:27
新米
居住地: 埼玉県
投稿: 10
使用環境:
WinXP,Flash8
Re: flv制御について
ご丁寧にありがとうございます。

さっそく試して見たところ、動作はしました。

ですが、this.startDrag(false, 0, 0, 133, 0);のコードの影響か、133秒以上の動画だと動きが不確定になってしまいました・・。

this.startDrag(false, 0, 0, 133, 0);はseekのMCの幅が133の為、markerをonPressした時に0?133間の間でドラッグ可能にするという処理だと思って記述しているのですが(markerのMCはseekの中の0座標に配置してます)、間違っているのでしょうか・・・。

度々の質問申し訳ありませんが、よろしくお願いします。




あにぃ
Åê¹ÆNo.36372
投稿日時: 2007-11-20 15:01
職人
居住地: 北海道
投稿: 250
使用環境:
Flash8
FlashCS3
WinXP
FlashLite1.1 / 2.0
Re: flv制御について
seek(n)とすると、動画のn秒目に飛ぶことになります。
なので、現在のスクリプトでは133秒の動画でしか正常の動きをしないと思われます。

startDrag(this, false, 0, 0, 133, 0);

ではないでしょうか?
startDragの第一引数は、ターゲットインスタンスへのパスだったような気がします。最近つかってないのでうろ覚えです。


----------------
質問する際には、ご自分でできる限り調べてから投稿して下さい

P・S 職人おめでとう。(08/10/09)

ひろゆき
Åê¹ÆNo.36374
投稿日時: 2007-11-20 15:18
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: flv制御について
引用:
あにぃさんは書きました:
startDrag(this, false, 0, 0, 133, 0);

ではないでしょうか?
startDragの第一引数は、ターゲットインスタンスへのパスだったような気がします。

loadMovie と同様に、startDrag には、
グローバル関数である startDrag() と
MovieClip のメソッドである MovieClip.startDrag() があります。

なので、両方使えます。
startDrag(target);
target.startDrag();


----------------
質問する際は、回答者に具体的な情報を与えてください。

みみみぃ
Åê¹ÆNo.36375
投稿日時: 2007-11-20 16:31
新米
居住地: 埼玉県
投稿: 10
使用環境:
WinXP,Flash8
Re: flv制御について
あにぃさん、ひろゆきさん

ご丁寧にありがとうございます。

133秒までの動画しか正常に稼働しないのは
_root.stream_obj.seek(_root.stream_obj.time = this._x);

によって、markerの位置の0?133までしかはかれないから、ですね・・。
すみません、勉強不足でした・・・。

this._xの箇所を修正して、再度調整してみます。
みみみぃ
Åê¹ÆNo.36376
投稿日時: 2007-11-20 17:38
新米
居住地: 埼玉県
投稿: 10
使用環境:
WinXP,Flash8
Re: flv制御について
すみません、再度質問です・・・。

133秒以外の動画に対応したく、前回ご回答を頂いたソースを若干修正しています。

seekのMCを、

onClipEvent(enterFrame) {
if(_root.marker){
var pos;
if( _root.total_time != 0 ) {
pos = _root.stream_obj.time /_root.total_time;
marker._x = Math.ceil(bar._width * pos);
}
}
}

に変更し、marker._xの位置を整数化することは出来たのですが、
(markerのほうのthis._xは整数で取ってしまっている為です)

markerのほうの

on (press) {
_root.stream_obj.pause();
this.startDrag(false, 0, 0, 133, 0);
_root.marker = false;
}
on (release, releaseOutside) {
this.stopDrag();
_root.stream_obj.seek(_root.stream_obj.time = this._x);
}

onClipEvent (mouseMove) {
updateAfterEvent();
}

の_root.stream_obj.seek(_root.stream_obj.time = this._x);の部分をどう変更したらがいいかわかりません・・・。

this._xのままでは当然133までしか計れず、困ってしまいました。
色々考慮しstream_obj.timeなどを逆算したりしてみたのですが結局対応は出来ませんでした・・・。

初歩的な質問かもしれませんが、どなたかご教授頂けたら幸いです。
あにぃ
Åê¹ÆNo.36379
投稿日時: 2007-11-20 18:22
職人
居住地: 北海道
投稿: 250
使用環境:
Flash8
FlashCS3
WinXP
FlashLite1.1 / 2.0
Re: flv制御について
メタデータよりトータルの時間を取得している様ですので、

on (release, releaseOutside) {
    this.stopDrag();
    _root.stream_obj.seek(Math.floor(_root.total_time*(this._x/133)));
}

等でいけそうな気がします。


----------------
質問する際には、ご自分でできる限り調べてから投稿して下さい

P・S 職人おめでとう。(08/10/09)

(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops