2015-11-24 3 views
2

Я использую веб-аудио api для декодирования n-канального аудиофайла в отдельные каналы, которые затем отображаются на холсте, чтобы визуально создавать частотомер.Более эффективный decodeAudioData()?

Я использую decodeAudioData для декодирования буфера массива из байтов, чтобы затем назначить источник источника звукового буфера в отдельной функции.

// load the specified sound 
function loadSound(url) { 
    var request = new XMLHttpRequest(); 
    request.open('GET', url, true); 
    request.responseType = 'arraybuffer'; 

    // When loaded decode the data 
    request.onload = function() { 

     // decode the data 
     context.decodeAudioData(request.response, function (buffer) { 
      // when the audio is decoded play the sound 
      holdingBuffer = buffer; 
      setupSound(buffer); 
     }, onError); 
    } 
    request.send(); 
} 

Проблемы я имею что когда я пытаться декодировать аудио вокруг 60MB +, браузер будет работать из-за отсутствие памяти функции space.The decodeAudioData чрезвычайно памяти голодный!

Мне было интересно, есть ли у кого-нибудь опыт более эффективных способов декодирования больших аудиофайлов?

+0

Вы работаете на мобильных устройствах? 60 МБ (сжатый) большой, но не такой большой для настольной машины. –

ответ

3

Проблема заключается в объеме памяти, занимаемом декодированным аудио. Для примера, я предполагаю, что ваш 60MB аудиофайл - это MP3.

Это, очевидно, зависит от битрейта, но скажем, вы находитесь на скорости 128 Кбит/с - что довольно типично. Это означало бы, что вы загружаете что-то около часа стерео аудио.

Но API-интерфейс Web Audio декодируется до 32-разрядных и обычно 44,1 или 48 кГц (это зависит от вашей звуковой карты, от того, что я помню).

В любом случае, скажем, 32-битный при 48 кГц.

Это означает, что каждый канал 32 * 48000 бит в секунду. Это 32 * 48000 * 60 бит в минуту и ​​32 * 48000 * 60 * 60 бит в течение всего часа. И, конечно, мы умножаемся на два, поскольку мы принимаем стерео.

Это означает, что 11059200000 полных битов аудиоданных - это аудио буфер 1,3824 ГБ, который необходимо загрузить в память. Итак, в основном - это тонна памяти.

Здесь действительно нет простого ответа. Вы могли бы попытаться генерировать сигналы/спектрографы/все на сервере. Или вы можете попробовать загрузить звуковой файл в кусках, чтобы вы могли обрабатывать их по отдельности (в последовательном порядке) и позволять вещам собирать мусор.

Могут быть другие решения, но это те, которые сразу приходят на ум.

+1

Или используйте MediaElementAudioSource для передачи mp3 через WebAudio. –

+0

Да, если рендеринг может произойти в реальном времени, это определенно работает. По какой-то причине я думал, что OP хочет генерировать сигнал, но похоже, что это на самом деле спектрограмма. –

+1

Вам не нужен весь аудиофайл в памяти сразу, независимо от того, что вы делаете. Вот почему API decodeAudioData безумный. – Esailija

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