Phaser HTML5 应用程序通过Phonegap Cloud Build 移植后无法播放声音

Posted

技术标签:

【中文标题】Phaser HTML5 应用程序通过Phonegap Cloud Build 移植后无法播放声音【英文标题】:Phaser HTML5 app cannot play sound after porting by Phonegap Cloud Build 【发布时间】:2015-11-27 03:33:32 【问题描述】:

这是一个简单的 Phaser 音频示例。它在我的 android 网络浏览器上运行良好。但是,通过 Phonegap 云构建移植到 Android 应用后,它会静音。

我知道如何在 Phonegap 应用 (How to loop a audio in phonegap?) 中播放声音(和循环),但不知道如何将其应用到 Phaser JS 框架中。

这是移植的应用程序。我可以安装和运行它,但没有声音。我错过了什么还是 Phonegap Cloud Build 支持 Phaser JS 中的 WebAudio?

https://build.phonegap.com/apps/1783695/

我的config.xml 是:

<?xml version="1.0" encoding="UTF-8" ?>
  <widget id="com.phaser.phasersound" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0">
<name>Phaser sound complete</name>
<description>
   Phaser sound phonegap
</description>
<gap:plugin name="org.apache.cordova.media" />
<icon src="icon.png" />
<preference name="splash-screen-duration" value="1"/>

<!--
  If you do not want any permissions to be added to your app, add the
  following tag to your config.xml; you will still have the INTERNET
  permission on your app, which PhoneGap requires.
-->
<preference name="permissions" value="none"/>
  </widget>

源代码是:(我把本地音频文件从本地改成github链接运行在代码sn-p上)

var game = new Phaser.Game(600, 800, Phaser.AUTO, 'phaser-example',  preload: preload, create: create );

function preload() 

	game.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL;
    
    //have the game centered horizontally
    game.scale.pageAlignHorizontally = true;
    game.scale.pageAlignVertically = true;

    game.stage.backgroundColor = '#414040';

    // I changed the local audio files from local to github links to run on code snippet

    /*
    game.load.audio('explosion', 'assets/audio/SoundEffects/explosion.mp3');
    game.load.audio('sword', 'assets/audio/SoundEffects/sword.mp3');
    game.load.audio('blaster', 'assets/audio/SoundEffects/blaster.mp3');
    */

    game.load.audio('explosion', 'https://raw.githubusercontent.com/nguoianphu/phaser-sound-complete-phonegap/master/www/assets/audio/SoundEffects/explosion.mp3');
    game.load.audio('sword', 'https://raw.githubusercontent.com/nguoianphu/phaser-sound-complete-phonegap/master/www/assets/audio/SoundEffects/sword.mp3');
    game.load.audio('blaster', 'https://raw.githubusercontent.com/nguoianphu/phaser-sound-complete-phonegap/master/www/assets/audio/SoundEffects/blaster.mp3');



var explosion;
var sword;
var blaster;

var text;

var text1;
var text2;
var text3;

function create() 



    var style =  font: "65px Arial", fill: "#52bace", align: "center" ;
    text = game.add.text(game.world.centerX, 100, "decoding", style);
    text.anchor.set(0.5);

    explosion = game.add.audio('explosion');
    sword = game.add.audio('sword');
    blaster = game.add.audio('blaster');

    //  Being mp3 files these take time to decode, so we can't play them instantly
    //  Using setDecodedCallback we can be notified when they're ALL ready for use.
    //  The audio files could decode in ANY order, we can never be sure which it'll be.

    game.sound.setDecodedCallback([ explosion, sword, blaster ], start, this);



var keys;

function start() 

    text.text = 'Press 1, 2 or 3';

    var style =  font: "48px Arial", fill: "#cdba52", align: "center" ;

    text1 = game.add.text(game.world.centerX, 250, "Blaster: Stopped", style);
    text1.anchor.set(0.5);

    text2 = game.add.text(game.world.centerX, 350, "Explosion: Stopped", style);
    text2.anchor.set(0.5);

    text3 = game.add.text(game.world.centerX, 450, "Sword: Stopped", style);
    text3.anchor.set(0.5);

    explosion.onStop.add(soundStopped, this);
    sword.onStop.add(soundStopped, this);
    blaster.onStop.add(soundStopped, this);

    keys = game.input.keyboard.addKeys( blaster: Phaser.Keyboard.ONE, explosion: Phaser.Keyboard.TWO, sword: Phaser.Keyboard.THREE );

    keys.blaster.onDown.add(playFx, this);
    keys.explosion.onDown.add(playFx, this);
    keys.sword.onDown.add(playFx, this);

    //  And for touch devices you can also press the top, middle or bottom of the screen
    game.input.onDown.add(onTouch, this);



function onTouch(pointer) 

    var b = game.height / 3;

    if (pointer.y < b)
    
        playFx(keys.blaster);
    
    else if (pointer.y > b * 2)
    
        playFx(keys.sword);
    
    else
    
        playFx(keys.explosion);
    



function playFx(key) 

    switch (key.keyCode)
    
        case Phaser.Keyboard.ONE:
            text1.text = "Blaster: Playing";
            blaster.play();
            break;

        case Phaser.Keyboard.TWO:
            text2.text = "Explosion: Playing";
            explosion.play();
            break;

        case Phaser.Keyboard.THREE:
            text3.text = "Sword: Playing";
            sword.play();
            break;
    



function soundStopped(sound) 

    if (sound === blaster)
    
        text1.text = "Blaster: Complete";
    
    else if (sound === explosion)
    
        text2.text = "Explosion: Complete";
    
    else if (sound === sword)
    
        text3.text = "Sword: Complete";
    

&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/phaser/2.4.4/phaser.js"&gt;&lt;/script&gt;

2015 年 12 月 1 日更新

这是我完成的源代码。它同时具有 .mp3 和 .ogg 声音文件。您可以在 Android 原生浏览器上播放它们(在 4.4.4 Samsung E5 上测试)。

来源:https://github.com/nguoianphu/phaser-sound-complete-phonegap

这是 Phonegap 上移植的应用程序。它可以显示屏幕但不能播放声音。 https://build.phonegap.com/apps/1783695/builds

【问题讨论】:

我看不到,您正在监听cordova deviceready-event。另一方面,加载外部脚本不是一个好主意,但如果你想这样做,你必须将 url 列入白名单。 @Joerg,谢谢。我编辑了 Phonegap 构建链接。该应用可以在 Android 上显示和触摸,但不能在音频上显示和触摸。 对于我的项目我使用this plugin 但是,这意味着你不能在浏览器上播放声音。如果它适合您,我可以将我的评论扩展为正确的答案,向您展示详细信息。 @Apovtx,谢谢。但是很难将您的插件应用到我的 Phaser 现有源代码中。我正在寻找 Phaser - Phonegap cloud build with sound 的示例。 @Tuan,所有平台都存在多个音频错误。你的目标设备是什么? (iPhone、iPad、Android 手机、平板电脑等) 操作系统的版本? (ios 8、iOS9、SDK-14、SDK-21 等)您使用的是标准的 webview 库还是插件(如 WKWwebview)? 【参考方案1】:

您正在尝试使用 webview 库播放音频。很可能使用html5 API for audio 或webaudio。如果两者都不是,则需要询问作者。

接下来,使用外部源 (http:) 不是最佳实践。您的资产(javascript、css、音频文件等)应该存在于设备上。如果您从 Web 加载文件,那么音质可能很差(或者音频可能根本无法播放 - 请参阅下面的 whitelist)。从设备加载。

Android 4.4.4 是 Kitkat。标准的 webview 库是exchanged for the chromium version。这意味着您的音频库可能对此感到困惑,或者您需要向图书馆提供有关此库的知识。这也意味着您的代码可能无法在 4.4.4 之前的设备上运行。 (主要是因为你无法测试它。)

您指向的链接可能使用核心media plugin,即使他们没有这么说。此外,该职位已超过 3 年。自他们以来,许多事情都发生了变化。 注意:您已在您的config.xml 中安装了media 插件。这可能就是您的循环起作用的原因。

你应该重新开始。你犯了很多错误。此外,除了您所拥有的一切,您还需要实现 whitelist 插件(如果您要导入文件或与网络通信)。

首先尝试这个sample app - 示例在 Android 和 iOS 上播放。您可以下载Android版本并进行测试。 iOS 版本需要我把你的 UUID 编译进去。

您可以选择16 audio plugins。我知道有一些做实时音频播放并且比“核心”插件有更好的控制。

你应该阅读:

Top Mistakes by Developers new to Cordova/Phonegap - 阅读粗体句子。 HOW TO apply the Cordova/Phonegap the whitelist system 如何Core Plugins Setup Phonegap--Generic-Boilerplate7 - 刚刚写了这个。它有效。 Phonegap Demo Apps Phonegap-Media-Test - 在 Android 和 iOS 上运行的示例的源代码。您可以下载 Android 版本并进行测试。

更新:2015-12-01 - 2am 以前,我忘记在 CSP 元标记中添加通配符 (*)。我现在包括这个。此元标记应添加到正在播放音频的index.html 文件的标题中。

请注意,您的应用现在不安全。保护您的应用由您决定。

<meta http-equiv="Content-Security-Policy" 
         content="default-src *; 
                  style-src * 'self' 'unsafe-inline' 'unsafe-eval'; 
                  script-src * 'self' 'unsafe-inline' 'unsafe-eval';">

更新:2015-12-01 - 下午 3 点 @Tuan,我已经应用了

中概述的所有修复程序 HOW TO apply the Cordova/Phonegap the whitelist system 如何Core Plugins Setup Phonegap--Generic-Boilerplate7 - 刚刚写了这个。它有效。

音频现在可以在我的 Android LG Leon/Android 5.1.1 上运行 老实说,我永远不会自己这样做,但是你的代码已经足够工作了,在我在我的 firefox(v34) 浏览器上测试它之后,我相当肯定它会工作。

更新: 2016-04-15 该代码已被删除。如果您需要代码,请在 cmets 中询问。

应该有足够的代码供你使用。

-Code

-Working Android App

- Phonegap Build Documentation

【讨论】:

谢谢,但我知道 Phonegap 可以播放音频。我的问题是Phaser游戏通过Phonegap移植后可以播放声音。您的示例有效,因为它不通过 Phaser 的功能播放音频。 显然我不够清楚。您对未来的任务知之甚少,您可能会花费数周和数月而永远找不到答案 - 主要是因为您对 Cordova/Phonegap 做出了错误的假设。要解决您的问题 1) 不要从 Internet 加载音频样本 2) 如果您必须加载音频样本 Internet,则需要实现 whitelist 系统 - 否则您的请求将被阻止。 3) 可能不支持 Phaser 的音频库 - 您需要有关它的详细信息才能做出合理的决定。 为了更加清楚,您的帖子现在看起来很混乱。主要是因为你做出了错误的假设。并且不会让您更接近您的目标 --- 这似乎是播放此 Phase 音频库。这就是我发布链接的原因。祝你好运。 嗯...我不清楚这一点。您的浏览器不是 Cordova/Phonegap 使用的 webview 库。你可以阅读我的Notes on webview here。简而言之,每个浏览器都使用它自己的自定义库。 (这是caniuse.com的原因)音频部分一直是最不一致的。了解音频库是否有效的唯一方法是进行最简单的测试。否则,你就是在浪费时间。祝你好运。 @Tuan,我在我的CSP 中发现了一个错误,这可以解释为什么你听不到声音。以前,我有script-src 'self' 'unsafe-inline' 'unsafe-eval';。我没有用于加载网络的通配符。应该是script-src * 'self' 'unsafe-inline' 'unsafe-eval';。大约一个小时前我在测试一个新应用程序时发现了这一点。我很惊讶直到现在还没有人提到它。让我知道。我将此添加到我的原始答案中。

以上是关于Phaser HTML5 应用程序通过Phonegap Cloud Build 移植后无法播放声音的主要内容,如果未能解决你的问题,请参考以下文章

Phaser.Game这个函数都有哪些参数

Phaser提供了Button对象简单的实现一个按钮

基于nodejs环境用Phaser来制作一个html5游戏

phaserjs 总结

phaser学习总结之phaser入门教程

APG -- Algorithm PlayGround 基于Phaser 的算法游戏(类rpg)框架