【问题标题】:How to preload a sound in Javascript?如何在 Javascript 中预加载声音?
【发布时间】:2011-07-15 21:06:42
【问题描述】:

感谢onload 功能,我可以轻松地预加载图像。但它不适用于音频。 Chrome、Safari、Firefox 等浏览器不支持音频标签中的onload 函数。

如何在不使用 JS 库且不使用或创建 HTML 标签的情况下在 Javascript 中预加载声音?

【问题讨论】:

  • 我知道的唯一方法是使用 <embed> 并引用声音使其不可见并禁用自动播放。但是如果您不想添加 HTML,我不确定还有什么可以推荐的。 -- 编辑:我知道你不想要一个库,但是这个可能值得检查(10K 大小):schillmania.com/projects/soundmanager2
  • 感谢 Brad,但 SoundManager 使用 Flash!

标签: javascript audio preload


【解决方案1】:

根据您的目标浏览器,在audio 标签上设置prelaod 属性可能就足够了。

【讨论】:

    【解决方案2】:
    //Tested on Chrome, FF, IE6
    
    function LoadSound(filename) {
        var xmlhttp;
        if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp = new XMLHttpRequest();
        } else { // code for IE6, IE5
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                document.getElementById("load-sound").innerHTML = '<embed src="' + filename + '" controller="1" autoplay="0" autostart="0" />';
            }
        }
        xmlhttp.open("GET", filename, true);
        xmlhttp.send();
    }
    

    参考

    【讨论】:

    • 我认为最好的选择是第二个链接中给出的解决方案。但它使用 JQuery。没有自然的方法吗?
    • 自然方式添加 ;) 让我知道。
    • 好的,我试试这段代码!虽然我认为像图像一样管理声音会很困难。为什么 Google、Mozilla、Microsoft 没有像处理图像那样实现预加载?
    • 我尝试了您的解决方案,但它对我不起作用,因为我必须创建嵌入标签。我只需要使用 JS。感谢您为 ASeptik 所做的努力!
    【解决方案3】:

    Remy 提出了一个利用 sprite 概念的 iOS 解决方案:

    http://remysharp.com/2010/12/23/audio-sprites/

    不确定它是否直接解决了预加载问题,但它的优点是您只需要加载一个音频文件(我想这也是一个缺点)。

    【讨论】:

    • 感谢 DA,但没用!
    【解决方案4】:

    您是否尝试对文件发出 ajax 请求?在完全加载之前,您不会显示/使用它。

    例如jQuery: How do you preload sound?(您不必使用 jQuery)。

    【讨论】:

    • 是的,如果没有选择,我想我会使用这个解决方案。我不想使用 JQery。
    【解决方案5】:

    您的问题是音频对象不支持“加载”事件。

    相反,有一个名为“canplaythrough”的事件,这并不意味着它已完全加载,但已经加载了足够多的内容,以当前的下载速率,它会在曲目有足够的时间播放完时完成。

    所以不是

    audio.onload = isAppLoaded;
    

    试试

    audio.oncanplaythrough = isAppLoaded;
    

    或者更好.. ;)

    audio.addEventListener('canplaythrough', isAppLoaded, false);
    

    【讨论】:

    • 感谢泰勒姆沃什伯恩!终于找到解决方案了!它对我有用!非常感谢! :-)
    • @Manuel Ignacio López Quintero:我想这只适用于HTML5,无论如何如果你想通过这种方式阅读这可能会帮助你bit.ly/ebZH3Z
    • @tylermwashburn 为什么 addEventListener 更好?
    • @tylermwashburn 这和onload有什么区别?这可以在 iOS 上使用吗?
    • 很好的解决方案,但由于完全愚蠢的预测,连接速度很慢。
    【解决方案6】:

    我尝试了 tylermwashburn 接受的答案,但它在 Chrome 中不起作用。所以我继续并创建了它,它从 jQuery 中受益。它还嗅探 ogg 和 mp3 支持。默认为 ogg,因为一些专家说 192KBS 的 ogg 文件与 320KBS 的 MP3 一样好,因此您可以节省 40% 的所需音频下载。但是 IE9 需要 mp3:

    // Audio preloader
    
    $(window).ready(function(){
      var audio_preload = 0;
      function launchApp(launch){
        audio_preload++;
        if ( audio_preload == 3 || launch == 1) {  // set 3 to # of your files
          start();  // set this function to your start function
        }
      }
      var support = {};
      function audioSupport() {
        var a = document.createElement('audio');
        var ogg = !!(a.canPlayType && a.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/, ''));
        if (ogg) return 'ogg';
        var mp3 = !!(a.canPlayType && a.canPlayType('audio/mpeg;').replace(/no/, ''));
        if (mp3) return 'mp3';
        else return 0;
      }
      support.audio = audioSupport();
      function loadAudio(url, vol){
        var audio = new Audio();
        audio.src = url;
        audio.preload = "auto";
        audio.volume = vol;
        $(audio).on("loadeddata", launchApp);  // jQuery checking
        return audio;
      }
      if (support.audio === 'ogg') {
        var snd1 = loadAudio("sounds/sound1.ogg", 1);  // ie) the 1 is 100% volume
        var snd2 = loadAudio("sounds/sound2.ogg", 0.3);  // ie) the 0.3 is 30%
        var snd3 = loadAudio("sounds/sound3.ogg", 0.05);
            // add more sounds here
      } else if (support.audio === 'mp3') { 
        var snd1 = loadAudio("sounds/sound1.mp3", 1);
        var snd2 = loadAudio("sounds/sound2.mp3", 0.3);
        var snd3 = loadAudio("sounds/sound3.mp3", 0.05);
            // add more sounds here
      } else {
        launchApp(1);  // launch app without audio
      }
    
    // this is your first function you want to start after audio is preloaded:
      function start(){
         if (support.audio) snd1.play();  // this is how you play sounds
      }
    
    });
    

    此外: 这是一个 mp3 到 ogg 的转换器: http://audio.online-convert.com/convert-to-ogg 或者您可以使用 VLC 媒体播放器进行转换。 通过右键单击 mp3 文件(在 Windows 中)并转到文件详细信息来检查您的 mp3 比特率。为新的“ogg”文件选择新的比特率时,尽量减少 40%。转换器可能会抛出错误,因此请继续增加大小直到被接受。当然测试声音是否令人满意。此外(这适用于我)如果您使用 VLC 媒体播放器测试音轨,请确保将音量设置为 100% 或更低,否则您会听到音频质量下降并可能错误地认为这是压缩的结果。

    【讨论】:

    • 非常有帮助,谢谢!至于音频转换,我实际上对 Audacity 非常满意(相对而言,因为它是一个免费工具)。提供批处理并且(理论上)比在线工具快得多,因为它是本地程序。 audacity.sourceforge.net
    • 另外,iOS 不支持 OGG
    猜你喜欢
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多