Ответ 1
Тем, кто проголосовал за этот пост: это действительно неэффективно, чтобы проголосовать за вопросы, не тратя время на то, чтобы предложить какое-то представление о том, почему вопрос как-то "плох". Я думаю, что этот вопрос имеет свои достоинства, и плакат явно потратил некоторое время, пытаясь решить проблему самостоятельно. Спецификация Web Audio на самом деле предназначена для того, чтобы разрешить именно такую функциональность, но пока не близок к выполнению этой цели:
В этой спецификации описывается JavaScript-интерфейс высокого уровня для обработки и синтеза аудио в веб-приложениях. Основная парадигма состоит из графика маршрутизации аудио, где несколько объектов AudioNode соединены вместе, чтобы определить общую визуализацию звука. Фактическая обработка будет в основном выполняться в базовой реализации (обычно оптимизированный код Assembly/C/С++), но прямая обработка и синтез JavaScript также поддерживается.
Здесь приведено описание текущей версии w3c звуковой спецификации, которая делает следующие пункты:
- При обработке аудио в JavaScript очень сложно получить надежный звук без сбоев при достижении достаточно низкой задержки, особенно при большой нагрузке процессора.
- JavaScript намного медленнее, чем сильно оптимизированный код на С++, и не может воспользоваться преимуществами оптимизации SSE и многопоточности, что имеет решающее значение для получения хорошей производительности на современных процессорах. Оптимизированный собственный код может быть в два раза быстрее для обработки БПФ по сравнению с JavaScript. Он недостаточно эффективен для интенсивной обработки звука, такого как свертка и пространственная пространственная пространственная обработка большого количества источников звука.
- setInterval() и обработка XHR украдут время обработки звука. В достаточно сложной игре некоторые ресурсы JavaScript понадобятся для игры в физике и графике. Это создает проблемы, потому что аудио-рендеринг выполняется с минимальным сроком (во избежание сбоев и недостаточной латентности). JavaScript не запускается в потоке обработки в реальном времени и, следовательно, может быть предупрежден многими другими потоками, запущенными в системе.
- Сбор мусора (и пулы автозапуска в Mac OS X) может вызвать непредсказуемую задержку в потоке JavaScript.
- Несколько контекстов JavaScript могут быть запущены в основном потоке, крадя время из контекста, выполняющего обработку.
- В главном потоке запускается другой код (кроме JavaScript), такой как рендеринг страниц.
- Замки могут быть приняты, а память выделена в потоке JavaScript. Это может привести к дополнительной приостановке потока.
- Проблемы сегодня еще сложнее с сегодняшними поколениями мобильных устройств, которые имеют процессоры с относительно низкой производительностью и потреблением энергии/временем автономной работы.
ECMAScript (js) очень быстро работает для многих вещей и все быстрее работает в зависимости от того, какой движок интерпретирует код. Однако для чего-то такого же интенсивного, как обработка звука, вам будет намного лучше использовать инструмент низкого уровня, скомпилированный для оптимизации ресурсов, специфичных для задачи. В настоящее время я использую ffmpeg на сервере для выполнения чего-то подобного.
Я знаю, что на самом деле неэффективно отправлять wav файл через интернет-соединение, чтобы получить более компактный .ogg файл, но это текущее состояние вещей с помощью веб-аудио api. Для выполнения любой клиентской обработки пользователь должен явно предоставить доступ к локальной файловой системе и привилегии выполнения файла для преобразования. Надеюсь, кто-то скоро рассмотрит эту вопиющую проблему. Удачи.
Изменить: вы также можете использовать Google native-client, если не хотите ограничивать пользователей Chrome. Похоже, что это очень многообещающая технология, которая загружается в песочницу и достигает скоростей почти как хороший изначально выполненный код. Я предполагаю, что в какой-то момент будут реализованы аналогичные реализации в других браузерах.