2013-06-09 4 views
6

Я пытаюсь написать RIA, который можно использовать как на мобильных, так и на настольных браузерах. Одной из главных целей этого приложения является воспроизведение звуков. Может быть много X (на данный момент есть 150+)Динамически созданный аудио-объект, не играющий в браузере Android Chrome

При определенном действии пользователя я хочу создать новый аудио объект, загрузить определенный клип и воспроизвести его. В идеале я бы создал новый объект «Audio», установил src wait load, а затем воспроизвел. Это работает на разных настольных браузерах, но, похоже, не работает на Android 4.2, Chrome и биржевых браузерах.

Я попытался 4 различных способов, включая аудио:

  1. В том числе (в HTML) только аудио блок, пусть он загрузит во время выполнения и вызов .play(); Однако это работает. Это означает, что я должен создать 150 + звуковых блоков. (это работает везде)
  2. Создайте новый экземпляр «Audio» и динамически настройте атрибут .src, а затем на loadcomplete call .play() (похоже, это работает только на настольных браузерах, НЕ на моем мобильном телефоне)
  3. Используйте jQuery для создания нового звукового тега, добавьте в dom, дождитесь загрузки, затем воспроизведите (это, похоже, работает только на настольных браузерах, а не на моем мобильном телефоне)
  4. Добавить звуковые теги в html с указанием, чтобы не загружать, ждать пользователя затем загрузите его, дождитесь его готовности, затем играйте (это работает везде).

Итак, большой вопрос: любая идея, почему это не работает?

** Редактировать ** Я знаю, что только один файл может воспроизводиться за раз, и именно это я и делаю здесь. Проект (функционально) похож на телефонную службу, где у вас есть 1 человек, записывающий цифры 0 - 9, затем он «говорит» номер телефона так «5». '5'. '5'. '0'. '1 '..... и т. д. Таким образом, один аудиопоток за один раз вполне приемлем ... Это просто заставить его играть, в чем проблема.

Как прямо сейчас, у меня есть следующий код, который также можно найти here

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>test</title> 
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script> 
<script> 
    var $a1, $a2, $a3, $a4; 
    $(document).ready(function(){ 
     _setupVars(); 
     _addListeners(); 
    }) 

    function _setupVars(){ 
     $a1 = $("#audio1"); 
     $a2 = $("#audio2"); 
     $a3 = $("#audio3"); 
     $a4 = $("#audio4"); 
    } 

    function _addListeners(){ 
     $a1.click(_handleAudio1); 
     $a2.click(_handleAudio2); 
     $a3.click(_handleAudio3); 
     $a4.click(_handleAudio4); 
    } 

    function _handleAudio1(){ 
     $("#america")[0].play(); 
    } 

    function _handleAudio2(){ 
     var a = new Audio(); 

     $(a).on("canplay", function(){ 
      a.play(); 
     }) 

     if(a.canPlayType("audio/mp3")) 
      a.src = "audio/test2.mp3"; 
     else if(a.canPlayType("audio/ogg")) 
      a.src = "audio/test2.ogg"; 
    } 

    function _handleAudio3(){ 
     var $x = $('<audio id="says">'+ 
       '<source src="audio/test3.mp3">'+ 
       '<source src="audio/test3.ogg">'+ 
       '</audio>'); 
     $x.on("canplay", function(){ 
      $x[0].play(); 
     }) 
     $("#audioCont").append($x); 
    } 

    function _handleAudio4(){ 
     var $x =$("#cat"); 
     $x.on("canplay", function(){ 
      $x[0].play(); 
     }) 
     $x[0].load(); 
    } 

</script> 
</head> 
<body> 
    <input type="button" id="audio1" value="play Audio Tag"/><br /> 
    <input type="button" id="audio2" value="play audio object"/><br /> 
    <input type="button" id="audio3" value="play dynamic Audio Tag"/><br /> 
    <input type="button" id="audio4" value="play load Audio Tag, then play"/><br /> 
    <audio id="america"> 
     <source src="audio/test1.mp3"> 
     <source src="audio/test1.ogg"> 
    </audio> 
    <audio id="cat"> 
     <source src="audio/test4.mp3"> 
     <source src="audio/test4.ogg"> 
    </audio> 

</body> 
</html> 

ответ

2

Методы 1, 2 & 3 не будет работать на IOS. К сожалению, большинство мобильных устройств ограничивают звук HTML5 одним источником, играющим одновременно. iOS требует взаимодействия с пользователем для начала воспроизведения медиафайлов (onload не учитывается).

+0

Я в порядке с 1 очками за один раз. Проект (функционально) похож на телефонную службу, где у вас есть 1 человек, записывающий цифры 0 - 9, затем он «говорит» номер телефона так «5». '5'. '5'. '0'. '1 '..... и т. д. Таким образом, один аудиопоток в то время совершенно приемлем ... Это просто попытка воспроизвести, в чем проблема (в хроме, еще не найдено устройство ios для тестирования) – whomba

+0

A один мультимедийный файл может воспроизводиться только с пользовательским взаимодействием, по одному за раз. – idbehold

7

В настоящий момент Chrome на Android существует явная потребность в том, чтобы пользователь «вызывал» воспроизведение с помощью жестов для воспроизведения звука. Были проблемы с перегрузкой полосы пропускания мобильных устройств или созданием раздражающих всплывающих окон, которые просто воспроизводят звук, что является одной из причин, по которой оно отключено по умолчанию.

Мы смотрим на его изменение, и если вы находитесь на бета-версии Chrome на Android, вы можете перейти по этой ссылке chrome://flags/#disable-gesture-requirement-for-media-playback, и это позволит вам переключить это поведение. Мы работаем над этой проблемой, и вы можете следить за ней по адресу Bug 160536

+1

В качестве продолжения этого я перешел на эту страницу выше, но я не могу найти настройку, которую мне нужно изменить? Не могли бы вы указать мне на это? –

+1

Хорошо, этот довольно старый, но вы можете определенно сделать это сейчас в Crosswalk/Cordova на Android, добавив '' xwalk --disable-gesture-required-for-media-воспроизведение'' в '' platform \ android \ assets \ xwalk-command-line'' - создать его, если он его уже нет. – Agamemnus

Смежные вопросы