Why isn't my audio rewinding?

荒凉一梦 提交于 2019-12-23 09:29:46

问题


I'm having a bit of trouble rewinding audio in Javascript. I basically have a countdown that beeps each second as it gets towards the end of the countdown.

I tried using;

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

but it didn't beep every second which I'm guessing has something to do withit having to load a new sound every second. I then tried loading the sound externally and triggering it with the following code.

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

but this only plays the sound once then completely fails to rewind it (this is shown by the console logging a time of 0.19 seconds after the first playthrough).

Is there something I'm missing here?


回答1:


In google chrome I noticed that it only works if you have the audio file in same domain. I have no problems if the audio file is in same domain. Event setting .currentTime works.

Cross-domain:

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

Same-domain:

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

I tried googling for a while and could find nothing in specs about this or even any discussion.




回答2:


when I want rewind I simply load the audio again:

my_audio.load()

*btw, I also use a eventlistener for 'canplay' to trigger the my_audio.play(). It seems that this is necessary in android, and maybe other devices also*




回答3:


To further dsdsdsdsd's answer with a bit of paint-by-numbers for the "whole shebang"

NOTE: In my app, loc1 is a dummy that refers to the song's stored location

// ... 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 ...

I spent days and days trying to figure out what I was doing wrong, but it all works fine now... at least on the desktop browsers...




回答4:


As of Chrome version 37.0.2062.120 m, the behaviour described by @Esailija has not changed.

I workaround this issue by encoding the audio data in base64 encoding and feed the data to Audio() using data: URL.

Test code:

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);
};

(I am surprised that there are no bug reports or references on this matter... or maybe my Google-fu is not strong enough.)



来源:https://stackoverflow.com/questions/11004437/why-isnt-my-audio-rewinding

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!