• ベストアンサー

flash  トップページ 自動再生防止

はじめまして。 どうしてもわからないことがあるので 知っている人がいたらぜひ教えてください。 ホームページをビルダーにて製作しているのですが その中にflashのファイルを貼り付けることにより 動画を再生しています。 現在私のホームページ構成 は以下となっております。 トップ:flashの動画を貼り付け、以下サブページと なっています。 私の希望は ”サブぺージからトップへ1分以内"で戻ったとき動画ストップ(静止画)いわゆるタイムラインで言えば最後のフレーム(stop状態)の絵を表示。 "サブぺージからトップへ1分以上経ってたなら"再び動画再生”ということをしたいです。 そうしないとサブからトップへすぐ戻るたびに動画が最初から再生してしまうからです。(もち、停止ボタンの使用や、戻りは他のhtmlを用意という姑息な手はしたくないです) ネットで調べたところ、sharedObjectを利用したローカルでの作業となるみたいですが何分初心者のため使い方がわかりません。よろしくお願いします。 環境:Windows XP Flash MX6

質問者が選んだベストアンサー

  • ベストアンサー
noname#35109
noname#35109
回答No.2

回答の前に, >> 停止ボタンの使用や、戻りは他のhtmlを用意という >> 姑息な手はしたくないです がかなり引っかかります。 その手がよければ,手段の1つであって,姑息だとは思いません。 また,そうされているサイト作成者の方が色々な理由により,そうされていることもあるでしょう。 まぁ,でも安心してください。 そんな手を使ってもできませんから。 そんな方法でどうやったらできるんだろう? と考えてしまいました。 一度,ちがうURLに飛びますからね。 停止ボタンの使用や、戻りは他のhtml では無理です。 方法は,御推測の通り,SharedObject を使うか, もしくはCGIなどサーバーサイドの言語を使ったものに変数を送ってその値を保存するかです。 CGIは疎い物で,下記の方法は SharedObject です。 ~・~・~・~・~・~・~・~・~・~・~・~・~・~・~・~・~ まず,1つのムービークリップを置く,専用のレイヤーを1つ用意してください。 そして,そのレイヤーにムービークリップを1つ作ってください。 形や大きさは何でもいいです。小さくて目立たない方が良いでしょう。 場所もステージ外の方が良いです。 そのムービークリップに以下のスクリプトを書いてください。 どこも変えずそのまま使用できます。 コピペ可↓ ------------------------------------------- onClipEvent (load) { myObject = SharedObject.getLocal("Watch"); myDate = new Date(); Watch2 = myDate.getTime(); if (myObject.data.Watch1 != undefined) { Watch1 = myObject.data.Watch1; frame = myObject.data.frame; } else { Watch1 = 0; } if (Watch1+60000>Watch2) { _root.gotoAndPlay(frame); } } onClipEvent (enterFrame) { myDate = new Date(); Watch3 = myDate.getTime(); myObject.data.Watch1 = Watch3; myObject.data.frame = _root._currentframe; } ------------------------------------------- あえて変えるとするならば, if (Watch1+60000>Watch2) { の 60000 の部分です。 これは単位はミリ秒で,60秒のこと,つまり1分です。 一応簡単に上のスクリプトの説明を書いておきます。 ※インデントをつけるために,各行の前には全角空白文字を入れています。  シンタックスエラーを起こすのでこちらはそのままコピペ不可です。 ------------------------------------------- //このMC(ムービークリップが読み込まれたとき) onClipEvent (load) {    //SharedObject を作成    myObject = SharedObject.getLocal("Watch");    //時刻オブジェクトを作成    myDate = new Date();    //変数 Watch2 に1970 年1月1日0 時以降のミリ秒を取得    Watch2 = myDate.getTime();    //もし sol ファイルに Watch1という変数があったら    if (myObject.data.Watch1 != undefined) {       //このMCの変数 Watch1にsol のWatch1の値を格納       Watch1 = myObject.data.Watch1;       //このMCの変数 frame にsol の frame の値を格納       frame = myObject.data.frame;    //もし sol ファイルに Watch1という変数がなかったら    } else {       //変数Watch1に 0 を代入       Watch1 = 0;    }    //Watch1に60秒を足した数がWatch2より大きければ    if (Watch1+60000>Watch2) {       //変数 frame のフレームに行く       _root.gotoAndPlay(frame);    } } //1フレーム進む時間毎に1回以下を実行 onClipEvent (enterFrame) {    //時刻オブジェクトを作成    myDate = new Date();    //変数 Watch3 に1970 年1月1日0 時以降のミリ秒を取得    Watch3 = myDate.getTime();    //SharedObject の 変数 Watch1に Watch3 の値を格納    myObject.data.Watch1 = Watch3;    //SharedObject の 変数 frame に,_root の今のフレーム数を格納    myObject.data.frame = _root._currentframe; } ------------------------------------------- ローカルでも使用可能ですが, 一応,実際に,自サイトにUPしてみてもも使えました。 なぜか一部のFlashMX に付いてくる FlashPlayer6(スタンドアローンの方) では SharedObject か動作しない場合があります。 もし動作しなければ,HTMLに貼り付いた状態のもので確認してみてください。 ブラウザを通したときに見るプラグインの方の FlashPlayer6 や FlashPlayer7 では大丈夫だと思います。

taira812
質問者

お礼

ありがとうございます! 試してわからなければ、また質問します。 「姑息な手」に関しては失礼しました。 確かに、人それぞれですよね。

taira812
質問者

補足

sassakunさんへ 無事解決しました。感謝の気持ちでいっぱいです。 お忙しい中、詳細に解説いただき大変に助かりました。また、貴方様方の知識も豊富で羨ましい限りでございます。今後も掲示板への私の質問等が目につきましたら、厳しいご指摘(ばしばしお願いします)、ご回答を心よりお待ちしてます。 ありがとうございました。

その他の回答 (3)

noname#35109
noname#35109
回答No.4

#2&3 です。 >> 質問2 あと、20秒経った後WEBを更新しても >> 動画が再生せず停止したままなのです。 そりゃそうです。そうしてますから。 他のページに行くまで,時刻をカウントしています。 それで,他のページへ行って,20秒後以降に戻ってくると,また動き出すわけです。 TOPページを見て20秒経った後,WEBを更新しても, 更新の直前までカウントしていて,その更新前の時刻と更新後の時刻を比較しますから,当然,一瞬しかなく,20秒以内です。 もし,「他のページに行って,20秒以内」ではなく, 「そのページを表示させて,20秒以内」の方が良いのでしたら,スクリプトはさらに簡単になります。 そのページを出る時刻を取得しなくて良いので, onClipEvent (enterFrame) 以降が不要になります。 --------------------------------------------- onClipEvent (load) { myObject = SharedObject.getLocal("Watch"); myDate = new Date(); Watch2 = myDate.getTime(); if (myObject.data.Watch1 != undefined) { Watch1 = myObject.data.Watch1; } else { Watch1 = 0; } //一応20000にしています。変えてください。 if (Watch1+20000>Watch2) { //20を最終フレーム数に変えてください。 _root.gotoAndStop(20); } myObject.data.Watch1 = Watch2; } } -------------------------------------------- となります。 繰り返しますが, これは,「ページが表示されてから次に表示されるまで」のスクリプトです。 「ページを出てから次に表示されるまで」だと#2のスクリプトになりますよ。 >> 質問1;_root.gotoAndStop(836)でフレーム836へ飛びません。 >> たぶんですが、フレーム1でストップしてます。 これが#3で書いた現象だと思います。 _root.gotoAndStop(836) でなくて, _root.gotoAndStop(3) くらいならうまく行くかもしれません。 上のスクリプトを実行している瞬時に836まで読み込むのは不可能でしょう。 もーーーーーーっと軽いファイルで,なおかつローカルであれば, _root.gotoAndStop(836) もおそらく成功すると思います。 ネット上で,あの重さで _root.gotoAndStop(836) はどう考えても不可能です。 回線が光の速いやつでも無理でしょう。 だからロード中は,このスクリプトが実行されないように待つ必要が出てきます。 それで,Now Loading... みたいなものが必要になるのです。 おそらく,ロード中はムービーをスタートさせない処理をするとうまく行くと思いますよ。 ロード中はこのスクリプト入りのムービークリップは表示させてはいけません。 ロードが完了したら→ gotoAndPlay(3);  みたいな場合であれば,3フレーム目からこのムービークリップを表示させてください。 表示させると言っても,ステージ外の見えないところでもかまいません。 ロード中はストップさせる仕組みですが, フレーム1に ------------------- stop(); ------------------- と書いて,ムービーをストップさせておいて, その1フレームだけに存在する,ムービークリップを1つ作って, そのムービークリップに ------------------------------- onClipEvent (enterFrame) { Total = _root.getBytesTotal(); Loaded = _root.getBytesLoaded(); if (Loaded>=Total) { _root.play(); } else { _root.stop(); } } ------------------------------- と書けば,簡単な「ロード中は1フレームで停止」するものができます。 2フレーム以降は,このムービークリップは消してください。 また2フレームになれば,#3や,この回答の一番上のスクリプトを書いたムービークリップを登場させると うまく行くと思いますよ。 ロード中はひたすら,フレーム1で静止しています。 凝ったものにする場合は,検索されて,サンプルを見つける方が早いです。 文字だけの説明より,実物の方がずっときれいな,ロード中画面ができると思います。

taira812
質問者

お礼

ご回答ありがとうございます。 最後のフレームへ飛ばないのはやはり一旦キャッシュしてからでないとだめですか・・早速、Now loadingを試してみます。あと更新の件ついても、なるほど了解いたしまた。 今度こそうまくいくと思いますが、それでもできなければまたアドバイスおねがいします・・・お手数おかけしてます。

taira812
質問者

補足

あっ、試す前もう一つ気になったことがあるので>_root.gotoAndStop(836) もNow loading でおそらく成功 とのことですが、その前に下記をためしてみました。 一旦トップページにて”836のフレームまで再生”次にサブへ移動後すぐにトップへ戻る この場合は”836のフレームまで再生”と”Nowloading後”は同じ意味ということになりませんか。 つまり、836のフレームまで終了させるってことはメモリー内では836までキャッシュされているはずです。それなのに実際トップ再生終了後→サブ→トップへを試しても同様に3フレームまでくらいしか表示しません。わたくしの見解ちがいでしょうか?

noname#35109
noname#35109
回答No.3

すみません,#2です。 >> 1分以内"で戻ったとき動画ストップ(静止画) >> いわゆるタイムラインで言えば >> 最後のフレーム(stop状態)の絵を表示。 でしたね。 うっかり勝手に,再生されていたフレームの続きを見せるのかと思いこんでしまいました。 「最後のフレーム(stop状態)の絵を表示」 でしたら,_root の _currentframe を保存する必要がないので,もう少し簡単になります。 コピペ可↓ ------------------------------------- onClipEvent (load) { myObject = SharedObject.getLocal("Watch"); myDate = new Date(); Watch2 = myDate.getTime(); if (myObject.data.Watch1 != undefined) { Watch1 = myObject.data.Watch1; } else { Watch1 = 0; } //ココの60000を変更してください if (Watch1+60000>Watch2) { //ここの400を最終フレームに変更してください _root.gotoAndStop(400); } } onClipEvent (enterFrame) { myDate = new Date(); Watch3 = myDate.getTime(); myObject.data.Watch1 = Watch3; } -------------------------------------- です。 説明は,#2で書いたのとほぼ同じで, _currentframe を保存する ところを取ったのと, _root.gotoAndStop(400); を定数にしたところです。 この _root.gotoAndStop(400); の400は最終フレームに変更してください。 ただし~! これは,理想状況でファイルが読み込まれたときの話です。 このMCが読み込まれたときに,最終フレームである400フレームまで読み込みが完了していなければ, 400フレームはないことになり,真っ白のまま停止する可能性かかなりあります。 現在,Nowloading などの「 読み込み中」 で1フレームでストップなどの処理がされていると, 問題ありませんが,そういう処理がないと,おそらく,変なフレームに飛んで,真っ白になると思います。 Nowloading 画面を表示するなどの処理をしてください。 Nowloading は,検索エンジンで検索すれば,たくさんサンプルが出てくると思います。 このことは,#2でも同じです。 軽いファイルで実験すると Nowloading がなくても大丈夫ですが,300KBを越えるような物はおそらくダメです。 あと,なぜか日本語ファイル名のSWFが表示されていますが,ネット上では御法度事項です。 ファイル名を半角英数文字にしてください。 表示が遅いのもそのせいかもしれません。 今,私の環境で,遅いながらも表示されているのは奇跡です。 おそらく,サーバーなどがなんとか対応しているのでしょう。 それとついでに, TOPのメニューをそんな感じに左横に縦並びにフレームのように表示させるのであれば, 他のコンテンツページでもそうするのが普通です。 他のコンテンツページでもそうするといちいちTOPページに戻ることなく,違うページに移動できます。 だから普通は,SharedObject なんて言う物は使わなくて良いのです。 普通のサイトは SharedObject なんて使っていないでしょう。 Flashとは関係ありませんし,大きなお世話だとは思いますが, サイト構成をいちいちTOPに戻るようにするパターンは変えた方が良いと思います。 少なくともブラウザの「戻る」でしか移動できないのも,あまりよろしくないと思います。 #2 のときに書こうと思って書かなかった "余計なお世話" 部分も書きましたが, #2の補足は以上です。 質問文の解釈を間違えていて,失礼しました。

taira812
質問者

お礼

ありがとうございます! 了解です、只今、少ない知識を絞りながら必死に 試しています。 わからなければまた、質問しますのでよろしくお願いします。

taira812
質問者

補足

sassakunさんへ 早速試しました。いくつか動作しないのでまた おねがいします。 サブからトップへ戻るとき動画はストップしてくれました。(現在は20秒の戻り時再生開始で設定してます。) →if (Watch1+20000>Watch2) ところが 質問1;_root.gotoAndStop(836)でフレーム836へ飛びません。たぶんですが、フレーム1でストップしてます。 質問2 あと、20秒経った後WEBを更新しても動画が再生せず停止したままなのです。(一応は、戻るで再生してくれますが・・) 下記が私のタイムラインです。参考にしてください。 レイヤー1 少林寺の絵 ;シンボリックに変換して(ここに貴方様のアクションスクリプトを記述、ここの最後のフレームが836へ飛んで静止してほしいんですが・・うまくいきません)            レイヤー2 背景(宇宙);フレーム1で停止するのでこの絵がでてしまってます。 レイヤー3 ボール      ・     ・ あと少しで解決ってことだと思うのですが、お手数おかけしてます。(その他指摘があった、html漢字表示 や、now loadingについても手直しの予定です) ありがとうございます、かなり勉強になっています。 ぜひアドバイスお待ちしております。

  • perse
  • ベストアンサー率74% (113/152)
回答No.1

まず、最初に著作権の方で引っかかっていると思います(音楽とぷーさん)が大丈夫でしょうか? 質問の方ですがFlashだけではまず無理です(他の言語と組合わせて出来るかはわかりません)。 sharedObjectは訪問者のPCにデータを保存するものでクッキーみたいなものです。 これを使えば訪問回数を保存させて、2回目の訪問だったら静止画を表示して訪問回数をクリアする。 みたいなことは可能です。 余計なことかもしれませんが、トップページにFlashが貼ってあってしかも自動的に再生というのを嫌う人も結構いるようです。

taira812
質問者

お礼

ありがとうございます。 確かに著作権にひっかかりそうですね。わかってはいるのですが・・オリジナリティが苦手なもので・・ まあ、今回はじめてのホームページ作成 ということなのでお試しの意味を含めています。 気をつけます。 >トップページにFlashが貼ってあってしかも自動的に再生というのを嫌う人も結構いるようです。 →まさにそのとおりです、そういう人がいるため一回のみの再生にしたいのです。