0

わかりました。私の新しいウェブサイトが公開され、Google Apps を通じて配信されました。ひばりに、私はしばらく前に練習として書いた javascript / HTML5 Lunar Lander クローン (火星着陸船) を含めることにしました。ゲームをローカルで開くと正常に動作しますが、GAE 経由で配信すると、すべてのシステムでサウンドがロードされないようです。モバイルサファリでは、どれも読み込まれません。デスクトップのサファリでは、それらはすべて私のコンピューターでは確実に読み込まれますが、他のコンピューターでは読み込まれません。Chrome (デスクトップ) では動作しているように見えますが、iOS の Chrome では 1 つのサウンドしか読み込まれません。デスクトップでは、ロードに失敗するのは常に同じサウンドのようです ( explode1.mp3)、これは私がロードしている最小の音です。ご覧のとおり、そのリンクをクリックすると、サーバーからサウンドが正常にダウンロードされます...

最初は、問題は大文字と小文字の区別に関連しているように見えたので、ファイル名の大文字と小文字を切り替えましたが、その修正は機能し続けませんでした。私の読み込みバーは読み込まれたリソースの数に直接関係しているため、これは問題です。応答のない GET 要求を待っているだけです。特定のリソースですが、リソースを直接ロードするとうまくいきますか?

私はこれらの技術のほとんどに非常に慣れていないので、初心者の間違いを犯した可能性が非常に高いと言わざるを得ません。残念ながら、私は初心者なので、これらの初心者の間違いが何であるかはわかりません!

サウンドをロードするために使用するコードは次のとおりです。

function loadSound(soundName) {
    var newElement = document.createElement("audio");
    newElement.addEventListener("canplaythrough", assetLoaded, false);
    document.body.appendChild(newElement);

    var audioType = supportedAudioFormat(newElement);
    if (audioType == "") {
        alert("no audio support");
        return;
    }
    newElement.setAttribute("src", "lander/sounds/" + soundName + "." + audioType);

    console.log("loading sound " + newElement.src + "...");

    return newElement;
}

と...

function assetLoaded() {
    var assetName = this.src;

    numAssetsLoaded++;

    console.log("loaded asset " + numAssetsLoaded + " (" + assetName + ")");

    if (numAssetsLoaded >= numAssetsToLoad) {
        shipSpriteSheet.removeEventListener("load", assetLoaded, false);
        pointImage.removeEventListener("load", assetLoaded, false);

        thrustAudioElement.removeEventListener("canplaythrough", assetLoaded, false);
        explosionAudioElement.removeEventListener("canplaythrough", assetLoaded, false);
        victoryAudioElement.removeEventListener("canplaythrough", assetLoaded, false);
        musicTrackElement.removeEventListener("canplaythrough", assetLoaded, false);

        gameState = GAME_STATE_INIT;
    }
}

コンソール出力を見ると、すべてのサウンドのロードが開始されていることがわかります (特に、explode1.mp3) が、必ずしも終了して呼び出しているとは限りませんassetLoaded...

更新:
コンセンサスは、mp3 を使用してはならない(ちなみに、既に mp3、AAC、および ogg を使用していますが、デフォルトで mp3 に設定している) ことと、Web Audio API を使用する必要があることです。これらはどちらも歓迎すべき情報であり、必要な変更を加えます。しかし、元の質問である「特定のサウンドがデスクトップに確実にロードされないのに、他のサウンドは問題なくロードされるのはなぜですか?」という最初の質問に対する答えはまだありません。誰かがそれをクラックしたいですか?それとも、「これらのことは非常に予測不可能であり、Web Audio API のようなより信頼できる方法論に切り替える以外に修正する方法はありません」のような答えになるのでしょうか?

UDATE:これ
は私のファイルからの抜粋で、app.yamlGAE がサーバーをセットアップするのに役立ちます。

- url: /(.*\.(mp3|ogg|wav))
  static_files: \1
  upload: (.*\.(mp3|ogg|wav))
4

2 に答える 2

1

次の点に注意してください。

  • HTML5 ゲームには MP3 を使用しないでください。
  • すべてのサウンドを AAC (.m4a) と Ogg Vorbis (.ogg) の両方にデュアル エンコードして、どこでも再生できるようにする必要があります。
  • サーバーにオーディオ ファイル用の正しい MIME タイプがあることを確認する必要があります。一部のブラウザーは、サーバーが間違った MIME タイプを持っていると言った場合でも喜んでオーディオを再生します。他の人は静かに失敗します。AAC と Ogg Vorbis の場合、タイプはそれぞれ audio/mp4 と audio/ogg です。
  • ほとんどのモバイル デバイスでは、一度に 1 つのサウンドしか再生できません。また、iOS では通常、ユーザーが開始した入力イベント ( などtouchstart) でない限り、オーディオを再生できません。
  • iOS でも再生の信頼性が高くポリフォニックであるため、サポートされている場合は (Chrome および iOS 6 以降) Web Audio API を使用することをお勧めしますが、iOSはユーザー入力イベントまで Web Audio API をミュートすることに注意してください。
于 2012-11-11T13:54:19.730 に答える
0

これは、サウンドが再生されない理由に関するあなたの質問に対する直接的な回答ではありませんが、ゲームのサウンド エフェクトで何をすべきかということのようなものです。

ゲームの効果音については、HTML5 Web Audio API を使用することをお勧めします。これにより、サウンドの再生方法をより詳細に制御できます (効果音のピッチ、再生の遅延の低減など)。

http://www.html5rocks.com/en/tutorials/webaudio/intro/

于 2012-11-11T12:39:50.983 に答える