7

我在 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 秒的时间来显示)。

我在这里缺少什么吗?

4

4 回答 4

12

在谷歌浏览器中,我注意到它只有在您拥有同一域中的音频文件时才有效。如果音频文件在同一个域中,我没有问题。事件设置.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

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

于 2012-06-12T20:49:16.517 回答
3

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

my_audio.load()

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

于 2013-06-09T20:56:43.933 回答
0

为了进一步 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 ...

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

于 2014-02-28T21:08:25.763 回答
0

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

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

测试代码:

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 不够强大。)

于 2014-10-29T15:20:58.390 回答