- ベストアンサー
外部mp3をストリーミング再生させる記述
- ストリーミングを表示するためのプログレスバーと、クリックしたらmp3が再生できるボタンを配置したい。
- 記述の方法によっては、サーバーにファイルをアップロードする必要があるかもしれません。
- on(press)イベントで、指定したフォルダとファイルのmp3をロードして再生し、プログレスバーの表示を更新します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
全てが,おかしいです。 アップロードしても無理です。 やりたいことが,わからない部分もありますが, スクリプトを見て, おそらくこんなことがやりたいのではないかというものに修正してみました。 外部 files フォルダに music1.mp3 を置いた場合です。 ----------------------------------- on (press) { soundName = "files/music1"; mySound.loadSound(soundName+".mp3", true); this.onEnterFrame = function() { this.myBar._xscale = (mySound.getBytesLoaded()/mySound.getBytesTotal())*100; }; } ----------------------------------- フレーム1 の mySound = new Sound(); で生成された mySound はサウンドインスタンスです。 それも,スクリプト上で生成されたインスタンスで, 実際には目に見えないはずです。 ◎ プログレスバーについて mySound.myBar.x_scale = (getBytesLoaded … これは変です。 その目に見えないインスタンスの中に,myBar は作れるはずがありません。 それもサウンドインスタンスの中です。 そんな無茶な所にムービークリップは置けません。 myBar はおそらく,_root(メインムービーのタイムライン)のステージ上に置かれているのではないでしょうか。 そしたら, this.myBar._xscale = (mySound.ge… もしくは _root.myBar._xscale = (mySound.ge です。 次に, (getBytesLoaded ()/getBytesTotal ()) ですが, 何のロード済みバイト数と何のトータルバイト数をgetしたいのでしょうか。 これだとボタンの置かれた _root のバイト数が出ると思います。 音のバイト数をgetしたいのであれば, (mySound.getBytesLoaded()/mySound.getBytesTotal()) です。 次に mySound.myBar.x_scale = (getBytesLoaded ()/getBytesTotal ())*100; 仮にこれが,うまく行くスクリプトだとして(実際にはうまく行きませんが), これを1回書いただけでしたら, 1回実行されるだけです。 例えば,右辺の数値が 100 になったとした場合 _root.myBar.x_scale = 100; です。 これは決定です。当然ながら100のまま動きません。 右辺が随時更新されるもので,更新の度に myBar を伸縮させたいのでしたら, 何度でも何度でも随時実行させなければなりません。 一応,上では,簡単ですから onEnterFrame を使ってみました。 onEnterFrame は,1フレーム進む時間ごとに1回(デフォルトのフレームレートでは12分の1秒に1回)ずつ,{ } 内が実行されます。 プログレスバー のそれもスクリプトの 1行だけでも,かなり無茶苦茶だと思います。 ◎ 本文について mySound="フォルダ名/データ名.mp3" これは人間でもさっぱり意味がわかりません。 PCならなおさらわかりません。 mySound は Flash 内に生成された,サウンドインスタンスです。 それが,なんで外部ファイルになるのでしょうか。 soundName = "files/music1"; と別の変数にしました。 mySound.loadSound(フォルダ名/データ名.mp3 + ".mp3",true); これも人間が見ても意味不明です。 フォルダ名/データ名.mp3 は変数名扱いになります。 これは,意味不明すぎたので勝手に mySound.loadSound(soundName+".mp3", true); ということがしたいのではないかと, 推測して書き直してみました。 2行続けると意味がわかります。 soundName = "files/music1"; mySound.loadSound(soundName+".mp3", true); soundNameという変数名に, 外部mp3 のパスとファイル名(拡張子なし)までを代入し, その,soundName + ".mp3" つまり, files/music1.mp3 をストリーミング true で読み込むと言うことになります。 なんで,外部ファイルへのパスを変数化しなければならないのかは, よくわかりませんが,何か意味があるのかもしれないと思い,上の2行のようにしてみました。 mySound.start(); ストリーミング再生では不要です。 =================================== と言う具合に, 1行1行がすべて変です。 人間だと雰囲気でこうではないだろうかと推測できますが, PCでは完全に ??? 状態で何も動作しません。 >> 下記の構造と記述では上手く行きません、 >> サーバーに上げないと駄目なのでしょうか? 今回の回答で上に書いたスクリプトでは, プログレスバー の部分を除いてローカルPC上でもうまく動作するはずです。 ローカルPC上だと (mySound.getBytesLoaded()/mySound.getBytesTotal())*100; の値は一瞬で 100 になりますから, この動きを確認するには,かなり重い(1MBとか) mp3 ファイルをアップしないと実際には確認できないかもしれません。 もしくは, 「 ムービープレビュー」→「表示」→「ダウンロードのシミュレート」で確認です。 mp3 のストリーミングは,回線によっては結構とぎれとぎれになるようです。 何というか, サウンドに関してではなく,全体的に Flash を理解していらっしゃっらないようなので, 他もたくさん不具合が出ると思います。 回答するのが恐いご質問ですが,勇気を持って回答させていただきました。
その他の回答 (1)
#1です。 訂正です。 >> 構造 >> >> Progressバー⇒MC >> ボタン⇒MC この,ボタン⇒MC を見落としていました。 ボタンはボタンシンボルではなくて,ムービークリップなのですね。 そしたら,次のようなスクリプトになると思います。 ----------------------------------------------- on (press) { soundName = "files/music1"; _root.mySound.loadSound(soundName+".mp3", true); this.onEnterFrame = function() { _root.myBar._xscale = (_root.mySound.getBytesLoaded()/_root.mySound.getBytesTotal())*100; }; } ----------------------------------------------- 詳細は,#1で説明しています。 #1のスクリプトとはパスが違うだけです。
お礼
長文になってしまったにもかかわらずありがとうございました! 確かに今まで作例を見ながらの記述か、ラベルとボタンでのフレーム間の移動しかやったことがなかったです。 初めて自分で記述を試みたわけですが、話にならなかったみたいです(笑) とりあえず一つずつの記述・・・というかまず構造概念の理解が先ですね(汗) なにはともあれありがとうございました、とても助かりました!!