【问题标题】:Play Sound In Meteor-Cordova App在 Meteor-Cordova 应用程序中播放声音
【发布时间】:2015-02-10 12:13:53
【问题描述】:

使用没有cordova的meteor,我可以在浏览器中使用

 new Audio('test.mp3').play()

test.mp3 位于公用文件夹中。但是,一旦我将我的应用程序作为设备上的科尔多瓦应用程序运行,我就无法播放声音。我究竟做错了什么?谢谢。

【问题讨论】:

  • 你试过了吗:new Audio('/test.mp3').play()?
  • @stubailo 我做到了。
  • 您是否碰巧发现了不需要其他请求 (http) 的内容?
  • @jimmiebtlr 我还没有找到一个很好的解决方案。你呢?
  • 还没有,查看媒体插件源对我也没有多大帮助。

标签: cordova meteor


【解决方案1】:

tl;博士

  1. 安装cordova媒体插件meteor add cordova:org.apache.cordova.media@0.2.15

  2. 将音频文件添加到公共目录

  3. 使用/android_asset/www/application/path/to/sound.wav

如果您在项目中查看此文件夹,

$PROJECT_ROOT/.meteor/local/cordova-build/platforms/android/assets/www/

您将看到您的应用程序是 cordova 为 android 构建的。

使用 Cordova Media 插件,我尝试使用文件路径 /android_asset/www/path/to/sound.wav 无济于事。

# Install the cordova media plugin with this command
meteor add cordova:org.apache.cordova.media@0.2.15

相反,我看到我的声音文件夹位于 www 目录中,但位于应用程序目录下。所以,这个文件路径最终对我有用,

/android_asset/www/application/path/to/sound.wav

这是对我有用的相关代码。

function getMediaUrl(sound) {

  if (device.platform.toLowerCase() === "android") {

    return cordova.file.applicationDirectory.replace('file://', '') + 'www/application/' + sound.substr(1);

  }
  else {

    return cordova.file.applicationDirectory.replace('file://', '') + sound.substr(1);

  }

}

function playSound(sound) {

  return new Media(

    getMediaUrl(sound),

    function (success) {
      // success
    },
    function (err) {
      // error
    }
  );
}

var test = playSound('/sounds/test.wav');

test.play();

注意:我将音频文件包含在公共文件夹中,即

$PROJECT_ROOT/public/sounds/test.wav

在 Android 上,这个文件路径被翻译成

/android_asset/www/application/sounds/test.wav

【讨论】:

  • 对于 iOS,我必须使用这个:return cordova.file.applicationDirectory.replace('file://', '') + 'www/application/' + sound.substr(1); 所以这部分不仅仅适用于 android。
  • ^ 是的,它们都是一样的。
  • 谢谢!有用!我用cdvfile://代替file://...和www/application/app/代替www/application/。
  • 我根本无法让它在 iOS 上运行。 @Yong:您是用空字符串替换 cdvfile:// 还是实际上将 cdvfile:// 添加到路径中?有人可以写一个完整的路径吗?
  • @Pueggel 这里是我使用的函数 ``` function getMediaUrl(sound) { if (device.platform.toLowerCase() === "android") { return cordova.file.applicationDirectory .replace ('cdvfile://', '') + 'www/application/app/' + sound.substr(1); } else { return cordova.file.applicationDirectory .replace('cdvfile://', '') + sound.substr(1); } } getMediaUrl('/sounds/music_name.mp3') ```
【解决方案2】:

似乎有两种可能的解决方案。第一个可能是更正确的解决方案仅对科尔多瓦应用程序有效。由于插件依赖,它不会在浏览器中工作。第一步是添加cordova插件:

  meteor add cordova:org.apache.cordova.media@0.2.15 

接下来构建一个播放声音的函数:

playLimitSound = function() {
  if (Meteor.isCordova) {
        var my_media = new Media('http://MY_IP:port/test.mp3',
            // success callback
            function () {
                console.log("playAudio():Audio Success");
            },
            // error callback
            function (err) {
                console.log("playAudio():Audio Error: " + err);
            }
        );
        // Play audio
        my_media.play();
}

};

这是另一种解决方案。它适用于浏览器和cordova-app。

 new Audio('http://MY_IP:port/test.mp3').play()

【讨论】:

  • 这在 Cordova 上不会那么好,因为它会从 Web 服务器而不是本地设备加载声音。
【解决方案3】:

iOS 推送通知声音也有类似的问题。当我在 Xcode 编译应用程序之前将声音文件添加到 Xcode 中的 Resources 文件夹时,它已解决。在这种情况下,您可以将其称为:

if (Meteor.isCordova) {
  var NotificationHandler = function(evt) {
    if (evt.sound) {
      var snd = new Media( 
        Meteor.absoluteUrl(evt.sound), 
        function() { console.log('media ok'); }, 
        function(err) { console.log('media error',err); }
      );
      snd.play();
    }
  };
}

其中 evt.sound 是例如 'test.mp3'

我将媒体插件安装为

 meteor add cordova:org.apache.cordova.media@0.2.14

【讨论】:

  • 在示例代码中,您使用解析为 http://URL:PORT/resource_location 的 absoluteUrl 当您说将其添加到资源文件夹时,我们所说的确切路径是什么? public/resources/sound.wav 之类的东西?
  • 路径在你的 cordoba 构建中,而不是在 Meteor 项目的公共目录中。对于 iOS,最好的方法是将它们拖放到项目的 Xcode 资源目录中。然后 Xcode 将它们添加为资源(添加图标和启动画面的方式相同)...
【解决方案4】:

如果您真的想在本地播放声音(没有互联网连接),那么您需要将您的主机地址更改为:

http://meteor.local/[your_subfolder(s)_if_you_got]/your.mp3

使用此 URL,您当然可以进行上述媒体或音频通话。如果您的资产位于公用文件夹或资源文件夹中,那么您始终可以根据设计假定此 URL 将这些文件复制到您的应用程序包中。

【讨论】:

  • 您使用的是哪个版本的 Meteor? Meteor 1.3 发生了变化。
  • 对我也不起作用。我在 Meteor 1.4.something 上。
【解决方案5】:

我无法让任何提议的解决方案以任何形式或形式在 Android 上运行。我在 Android 上的应用程序在尝试播放声音时会默默地失败。

最后,这对我有用:

        var player = new window.Audio();

        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                player.src = window.URL.createObjectURL(this.response);
                player.play();
            }
        };
        xhr.open('GET', "/audio.mp3");
        xhr.responseType = 'blob';
        xhr.send();

来自here。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多