【问题标题】:Why isn't my audio rewinding?为什么我的音频不倒带?
【发布时间】:2012-06-15 19:03:57
【问题描述】:

我在用 Javascript 倒带音频时遇到了一些问题。我基本上有一个倒计时,当它接近倒计时结束时,它会每秒发出哔哔声。

我试过用;

var bip = new Audio("http://www.soundjay.com/button/beep-7.wav");
bip.play();

但它并不是每秒都发出哔哔声,我猜这与它必须每秒加载一个新声音有关。然后我尝试从外部加载声音并使用以下代码触发它。

bip.pause();
bip.currentTime = 0;
console.log(bip.currentTime);
bip.play();

但这只会播放一次声音,然后完全无法倒带(这可以通过控制台在第一次播放后记录 0.19 秒的时间来显示)。

这里有什么我遗漏的吗?

【问题讨论】:

    标签: javascript html audio html5-audio


    【解决方案1】:

    在 google chrome 中,我注意到它仅在您拥有同一域中的音频文件时才有效。如果音频文件在同一个域中,我没有问题。事件设置.currentTime 有效。

    跨域:

    var bip = new Audio("http://www.soundjay.com/button/beep-7.wav");
    bip.play();
    bip.currentTime; //0.10950099676847458
    bip.currentTime = 0;
    bip.currentTime; //0.10950099676847458
    

    同域:

    var bip = new Audio("beep-7.wav");
    bip.play();
    bip.currentTime; //0.10950099676847458
    bip.currentTime = 0;
    bip.currentTime; //0
    

    我尝试了一段时间的谷歌搜索,但在规范中找不到任何关于此的内容,甚至没有任何讨论。

    【讨论】:

    • 多么奇怪的错误。这似乎解决了它,所以非常感谢你:)我最终还是要把它托管在同一个域上,但我想我会先在 JSfiddle 中尝试一下,以节省时间哈哈。
    • this 表示设置 currentTime 容易出错。
    【解决方案2】:

    当我想倒带时,我只需再次加载音频:

    my_audio.load()
    

    *btw,我还为“canplay”使用事件监听器来触发 my_audio.play()。这似乎在android中是必要的,也许其他设备也有*

    【讨论】:

      【解决方案3】:

      为了进一步回答 dsdsdsdsd 对“整个 shebang”的一些数字的回答

      注意:在我的应用中,loc1 是一个虚拟对象,表示歌曲的存储位置

      // ... code before ...
      
      tune = new Audio(loc1); // First, create audio event using js
      
      // set up "song's over' event listener & action
      tune.addEventListener('ended', function(){
      tune.load();    //reload audio event (and reset currentTime!)
      tune.play();    //play audio event for subsequent 'ended' events
      },false);
      
      tune.play();        // plays it the first time thru
      
      // ... code after ...
      

      我花了几天时间试图找出我做错了什么,但现在一切正常......至少在桌面浏览器上......

      【讨论】:

        【解决方案4】:

        截至 Chrome 版本 37.0.2062.120 m,@Esailija 描述的行为没有改变。

        我通过将音频数据编码为 base64 编码并使用data: URL 将数据提供给Audio() 来解决此问题。

        测试代码:

        snd = new Audio('data:audio/ogg;base64,[...base64 encoded data...]');
        snd.onloadeddata = function() {
          snd.currentTime = 0;
          snd.play();
          setTimeout(function() {
            snd.currentTime = 0;
            snd.play();
          }, 200);
        };
        

        (我很惊讶没有关于这个问题的错误报告或参考......或者我的 Google-fu 不够强大。)

        【讨论】:

          猜你喜欢
          • 2011-01-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多