Воспроизведение BLOB-объекта в элементе audio на Android

У меня есть код, который отлично работает на рабочем столе в Chrome и Firefox, и теперь я пытаюсь заставить его работать на Chrome в Android. Я создал звук в браузере и хотел бы представить элемент управления звуком, чтобы пользователь мог нажать кнопку воспроизведения. Вот окончательный вид элемента управления:

<audio controls src="blob:https%3A//mydomain.com/5b7cbd96-b204-4b1c-8de3-9fb212c37928"></audio>

Я попытался воспроизвести файл из браузера следующим образом:

<audio controls src="/sample.wav"></audio>

И это сработало нормально, поэтому я знаю, что управление звуком может воспроизводить файлы WAV.

Элементы управления тоже выглядят иначе. Тот, что играет с сервера, содержит тайминг, то есть «0:00/1:23». Тот, который создан в JavaScript, содержит только «0:00». Это наводит меня на мысль, что элемент управления на самом деле не загружал звук, но я понятия не имею, почему.

Я распечатал некоторую отладочную информацию о большом двоичном объекте и вижу, что сообщаемый размер составляет 184 440, а сообщаемый тип - «аудио/wav».

То, как я создал URL-адрес, который я поместил в src аудио, выглядит следующим образом:

// dataView is of type DavaView, and contains the WAV.
var audioBlob = new Blob([dataView], { type: "audio/wav" });
var url = URL.createObjectURL(audioBlob);

Как я буду отлаживать это дальше? Или есть другой способ настроить управление звуком для Android?

Спасибо!

Обновление:

Я не решил эту проблему, но я работал над ней. Вместо использования элемента управления <audio> для воспроизведения я использую AudioBuffer напрямую:

var source = audioCtx.createBufferSource();
var audioBuffer = audioCtx.createBuffer(1, sampleArray.length, audioCtx.sampleRate);
audioBuffer.copyToChannel(sampleArray);
source.buffer = audioBuffer;
source.connect(audioCtx.destination);
source.start();

person Paulie    schedule 26.01.2016    source источник
comment
Похоже на ошибку: code.google.com/p/chromium/ проблемы/подробности?id=227476   -  person Kerstomaat    schedule 26.01.2016
comment
Попробуйте использовать new Audio() с objectURL в качестве параметра, вызвав audio.load() перед audio.play(), см. stackoverflow.com/questions/33755524/   -  person guest271314    schedule 26.01.2016


Ответы (1)


По-видимому, Android Chrome не может воспроизводить звук из большого двоичного объекта. Я столкнулся с этой ошибкой, когда внедрял Recorder.js для записи звука в мобильных браузерах. В своем исследовании я столкнулся с парой проблем, о которых сообщалось в проекте хрома. Ошибка 1 Проблема 2

К счастью для меня, я работал над библиотекой Recorder.js, потому что иначе она бы Мне потребовалось намного больше, чем 1 день, чтобы найти исправление этой ошибки. Во всяком случае, по этому поводу была открыта проблема в Recorder.js git-репозиторий. Ответ @dokechin в этой теме сработал для меня. Спасибо @dokechin!

Просто преобразуйте свой большой двоичный объект в данные base64, и Android Chrome воспроизведет его. Вы можете сделать это так,

  var reader = new FileReader();
  reader.onload = function(e) {
      // e.targer.result will hold the base64 data.
      // Note: It includes the pre-text "data:audio/<format>;base64,<base64 data>"
      // Then do
      audio.src = e.target.result;
      // OR
      $("#your-audio-tag").attr("src", e.target.result);
  };
  reader.readAsDataURL(blob);
person Kaushik Evani    schedule 26.07.2016