HTML-тег audio.play() не воспроизводится в chrome

Я столкнулся с проблемой при воспроизведении аудио в Chrome, когда audio.src не вызывается перед воспроизведением вызова. Тем не менее, Firefox играет нормально. Может ли кто-нибудь предложить? Ниже ссылка на скрипку -

http://jsfiddle.net/vn215r2d/1/

Код также можно найти здесь -

<html>
   <head>
      <script language="javascript">      
          var audioo = document.createElement("audio");

          function newCall() {        
              audioo.src = "";
              audioo.src = "http://xx.xx.xx.xx:8181/api/captcha/sound";
              audioo.play();               
          } 

          function playAgain() {               
               audioo.play(); // doesn't work in chrome :(
          } 

      </script>
   </head>
   <body>
   <button type="button" onClick="newCall()">New Captcha Call</button>
   <br>
   <button type="button" onClick="playAgain()">Replay Captcha</button>   
</body>
</html>

person user3137592    schedule 24.10.2014    source источник
comment
Вы пробовали сбросить положение звука? audioo.currentTime = 0;, а затем audioo.play()?   -  person somethinghere    schedule 24.10.2014
comment
попробуйте использовать событие загрузки для аудиоэлемента.   -  person theinvisible    schedule 24.10.2014
comment
у меня работает на OSX Chrome v38.0   -  person Kaiido    schedule 24.10.2014
comment
@somethinghere - .curentTime не работает. Я пробовал это?   -  person user3137592    schedule 24.10.2014
comment
@ user3137592 Пожалуйста, проверьте мой ответ ниже. Я протестировал его, и он работает, хотя сначала нужно загрузить звук. Я изменю свой ответ, чтобы помочь вам обнаружить это.   -  person somethinghere    schedule 24.10.2014
comment
@theinvisible — атрибут src заполняется URL-адресом веб-сервиса. Поэтому, когда я вызываю audio.load(), он в основном делает новый аудиовызов, который здесь не требуется. Я хочу, чтобы audioo.play() просто воспроизводил то, что было получено при последнем вызове, а не делал новый вызов. Это отлично работает на firefox.   -  person user3137592    schedule 24.10.2014
comment
@ user3137592 Проверьте обновленный ответ ниже. Я проверил, и это работает. Используйте newCall() только для изменения вашего src. Он будет воспроизводиться, как только будет готов, и проверит, загружен ли звук.   -  person somethinghere    schedule 24.10.2014
comment
Спасибо за помощь. Только что ответил на ваш комментарий, пожалуйста, проверьте.   -  person user3137592    schedule 24.10.2014


Ответы (1)


Обновлять

О, вау, по-видимому, это сводится к тому, что audio.currentTime не доступен для записи, пока вы не перепишете src. Вот что вы можете сделать, и это работает:

function newCall() {  
    audioo.src = "http://xx.xx.xx.xx:8181/api/captcha/sound";
    // make all audio attributes writeable again by resetting the src
    audioo.src = audio.src;             
} 

Ответ немного погуглил, но я получил его отсюда: https://stackoverflow.com/a/14850353

Оригинал

Я тестировал в Chrome со сбросом положения звука, и это сработало. Безопаснее всего сначала сделать паузу, но это работает в любом случае.

var audioo = document.createElement("audio");

// Lets add an event listener to play when we are ready to start playing
audioo.addEventListener("canplaythrough", function(){
    audioo.play(); 
}, false); 

function newCall() {        
     audioo.src = "";
     audioo.src = "http://xx.xx.xx.xx:8181/api/captcha/sound";             
} 

function playAgain() { 
     // Let's check if we are ready enough to play
     if(audioo.readyState === 4){                       
         audioo.pause(); // first pause        
         audioo.currentTime = 0; // then reset           
         audioo.play(); // then play
     } else {
         // else inform us that we are not ready to play yet.
         alert("Audio not ready yet.");
     }
} 

Вот два забавных ресурса, которые могут помочь:

person somethinghere    schedule 24.10.2014
comment
Хорошо, я понимаю, что вы пытаетесь сказать, но currentTime=0 у меня не работает. Возможно, это связано с тем, что я пытаюсь вызвать веб-сервис (вызов GET) через атрибут src. Когда я вызываю локальный mp3 на своей машине, он отлично работает даже на хроме. Можете ли вы попробовать файл, который приходит по сети? - person user3137592; 24.10.2014
comment
Мне удалось получить аудиофайл для воспроизведения по сети. Есть ли какие-либо ошибки в вашей консоли? Как этот (если я ввожу неверный URL): net::ERR_FILE_NOT_FOUND ? - person somethinghere; 24.10.2014
comment
Нет, если бы это было так. Я бы не слышал звук, когда нажимаю кнопку «Новый вызов». Проблема в том, что audio.play() выполняется только один раз. Если я удаляю audioo.play() из функции newcall(), она выполняется в функции playAgain() ровно один раз. - person user3137592; 24.10.2014
comment
Проверьте обновление, но чувак, это одна странная проблема! Однако решение работает. - person somethinghere; 24.10.2014
comment
Да, это действительно странно, я пробовал все. Ваше обновление выше вызывает ошибку JS, потому что audio.src не определен. На всякий случай, если вам интересно знать, audio.play() работает хорошо, если я извлекаю аудиоданные (wav) в audio.src вместо URL-адреса, который извлекает данные. Однако, как мы видели ранее, использование URL-адреса воспроизводит его только один раз в Chrome :( - person user3137592; 25.10.2014
comment
Однако вы не должны получить неопределенность. Просто чтобы быть уверенным, вы случайно не ошиблись в названии, так как в примерах здесь это audioo с двумя o, которые мой словарь постоянно исправлял. Я попробовал это, и это сработало в хроме.... - person somethinghere; 25.10.2014