【问题标题】:What is the best audio file format to play audio from javascript in custom chromecast receiver在自定义 chromecast 接收器中从 javascript 播放音频的最佳音频文件格式是什么
【发布时间】:2015-03-20 03:10:20
【问题描述】:

我为游戏开发了一个简单的自定义 chromecast 接收器。

我在其中播放来自接收器 javascript 的短声音:

 this.bounceSound = new Audio("paddle.ogg");

在游戏加载时创建音频对象,然后使用:

 this.bounceSound.play();

在游戏需要时播放声音。

这在我笔记本电脑上的 chrome 中运行良好,但在我的 chromecast 中运行接收器时,有些声音无法播放,其他声音则延迟。

这可能是我为音频文件选择的声音格式 (.ogg) 的问题吗?

如果不是,还有什么问题。

他们有没有关于声音文件细节(频率、位深度等)的最佳实践?

谢谢

【问题讨论】:

    标签: javascript audio chromecast


    【解决方案1】:

    您应该在开始游戏之前预先下载声音。另请注意,这些声音随后将存储在内存中,而 Chromecast 的内存非常有限。确保这些声音很小并且都适合记忆。

    【讨论】:

    • 谢谢。他们是否有任何推荐的格式和格式参数来减少内存使用量,还是我必须假设“最小文件大小 == 最小内存使用量”?
    • 即使您使用压缩的音频格式,一旦将音频加载到内存中,它将被解压缩。因此,最好尝试不同的文件大小,看看哪些内容适合您的接收器应用程序。
    • 好的,我想我需要试验一下,看看哪个效果更好。我可能需要了解更多关于通过远程 chrome 调试测量音频的 JS 加载的内存使用情况.....
    【解决方案2】:

    仅作记录,以免其他开发者在尝试同时加载和播放多个短声音时产生混淆:

    在 Chromecast 上,HTML 视频和音频标签只能支持 一次单个活动媒体元素。

    (来源:https://plus.google.com/+LeonNicholls/posts/3Fq5jcbxipJ - 请务必阅读其余部分,其中还包含有关限制的重要信息)

    只会加载一个音频元素,其他的会得到错误代码 4(至少在我的调试过程中就是这种情况)。加载和播放几个短声音的正确方法是使用 Web Audio API,正如我在上面链接到的 Leon Nicholls 在他的 Google+ 帖子中所解释的那样。

    简单的网络音频 API 包装器

    我为基于 Web Audio API 的 JavaScript 中的 HTMLAudioElement 做了一个粗略的替换:

    function WebAudio(src) {
        if(src) this.load(src);
    }
    
    WebAudio.prototype.audioContext = new AudioContext;
    
    WebAudio.prototype.load = function(src) {
        if(src) this.src = src;
        console.log('Loading audio ' + this.src);
        var self = this;
        var request = new XMLHttpRequest;
        request.open("GET", this.src, true);
        request.responseType = "arraybuffer";
        request.onload = function() {
            self.audioContext.decodeAudioData(request.response, function(buffer) {
                if (!buffer) {
                    if(self.onerror) self.onerror();
                    return;
                }
    
                self.buffer = buffer;
    
                if(self.onload)
                    self.onload(self);
            }, function(error) {
                self.onerror(error);
            });
        };
        request.send();
    };
    
    WebAudio.prototype.play = function() {
        var source = this.audioContext.createBufferSource();
        source.buffer = this.buffer;
        source.connect(this.audioContext.destination);
        source.start(0);
    };
    

    可以这样使用:

    var audio1 = new WebAudio('sounds/sound1.ogg');
    audio1.onload = function() {
        audio1.play();
    }
    
    var audio2 = new WebAudio('sounds/sound2.ogg');
    audio2.onload = function() {
        audio2.play();
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      相关资源
      最近更新 更多