Подтвердить что ты не робот

Преобразование .wav файла в .ogg в javascript

Я пытаюсь захватить пользовательский аудиовход из браузера. Я сделал это с WAV, но файлы действительно большие. Один мой друг сказал мне, что файлы OGG намного меньше. Кто-нибудь знает, как конвертировать WAV в OGG? У меня также есть буфер исходных данных, мне не нужно конвертировать. Но мне просто нужен кодер OGG.

Здесь кодер WAV от Matt Diamond RecorderJS:

function encodeWAV(samples){
  var buffer = new ArrayBuffer(44 + samples.length * 2);
  var view = new DataView(buffer);

  /* RIFF identifier */
  writeString(view, 0, 'RIFF');
  /* file length */
  view.setUint32(4, 32 + samples.length * 2, true);
  /* RIFF type */
  writeString(view, 8, 'WAVE');
  /* format chunk identifier */
  writeString(view, 12, 'fmt ');
  /* format chunk length */
  view.setUint32(16, 16, true);
  /* sample format (raw) */
  view.setUint16(20, 1, true);
  /* channel count */
  view.setUint16(22, 2, true);
  /* sample rate */
  view.setUint32(24, sampleRate, true);
  /* byte rate (sample rate * block align) */
  view.setUint32(28, sampleRate * 4, true);
  /* block align (channel count * bytes per sample) */
  view.setUint16(32, 4, true);
  /* bits per sample */
  view.setUint16(34, 16, true);
  /* data chunk identifier */
  writeString(view, 36, 'data');
  /* data chunk length */
  view.setUint32(40, samples.length * 2, true);

  floatTo16BitPCM(view, 44, samples);

  return view;
}

есть ли для OGG?

4b9b3361

Ответ 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. Похоже, что это очень многообещающая технология, которая загружается в песочницу и достигает скоростей почти как хороший изначально выполненный код. Я предполагаю, что в какой-то момент будут реализованы аналогичные реализации в других браузерах.

Ответ 2

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

https://github.com/sb2702/audioRecord.js

Основное использование

audioRecord.requestDevice(function(recorder){
  // Request user permission for microphone access

      recorder.record(); // Start recording

      recorder.stop();  /Stop recording

      recorder.exportOGG(function(oggBlob){
        //Here your OGG file
      });

      recorder.exportMP3(function(mp3Blob){
               //Here your mp3 file
      });

      recorder.exportWAV(function(wavBlob){
            //Here your WAV file
      });

});

Используя опцию непрерывного воспроизведения mp3, вполне разумно захватывать и кодировать аудио вход полностью в браузере, кросс-браузер, без сервера или собственного кода.

DEMO: http://sb2702.github.io/audioRecord.js/

Он по-прежнему неровный по краям, но я попытаюсь его очистить/исправить.

Ответ 3

NEW: Производная работа записи рекордера Matt Diamond на Ogg-Opus

Чтобы закодировать файл Ogg-Opus в целом в браузере без специальных расширений, можно использовать порт Emscripten opus -tools/opusenc (demo). Он поставляется с поддержкой декодирования для WAV, AIFF и нескольких других форматов и встроенного повторного сэмплера.

Доступен Ogg-Vorbis encoder .

Поскольку вопросник в первую очередь предназначен для сжатия звука, их также может заинтересовать mp3 кодировка с использованием хромого.

Ответ 4

Хорошо, это может быть не прямой ответ, поскольку он не говорит, как преобразовать .wav в .ogg. И снова, зачем беспокоиться о преобразовании, когда вы можете напрямую использовать файл .ogg. Это зависит от API MediaRecorder, но браузеры, которые поддерживают WebAudio, обычно имеют это (Firefox 25+ и Chrome 47+)

демон github.io

Источник кода Github