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

Преобразование WAV в любой сжатый аудиоформат на клиентском JavaScript

Я записываю аудио с getUserMedia({audio:true}); в браузере с помощью Recorder.js, а затем экспортирую его как WAV файл, потому что это единственный вариант, который предоставляет библиотека.

1 минутный 20-секундный файл имеет размер 14,1 МБ. Мне нужно загрузить аудио на сервер, и мне нужно сделать это быстро. Как преобразовать WAV-аудио в любой другой сжатый формат, чтобы уменьшить размер файла?

Я не против преобразования:

  • MP3
  • Opus
  • WebM
  • Ogg
  • FLAC
  • любой другой формат, который вы знаете о

Если теперь нет возможности конвертировать в любой из этих форматов, как я могу сжать WAV файл на клиенте?

PS: Я сделал много поисков, чтобы найти что-нибудь, что конвертирует WAV в JS, но ничего не нашел. libmp3lame.js не работает в Chrome.

Спасибо!

4b9b3361

Ответ 2

То, что вы действительно хотите, это mediaStream "API записи", который в настоящее время работает. До тех пор, пока это не будет доступно, я советую использовать emscriptem на источнике C/С++ и подумать о том, чтобы запустить его в веб-обозревателе, чтобы избежать блокировки пользовательского интерфейса и других вкладок.

Ответ 3

Я столкнулся с той же проблемой и придумал довольно быстрое и грязное решение:

  • zip wav файл с zip.js(работает с Chrome, Firefox, Safari 6 и Internet Explorer 10)

Далее Intel увидит Документация zip.js

По крайней мере, это уменьшает размер, файл примерно на 75% меньше, поэтому сжатие 1: 4

ОБНОВЛЕНИЕ: Возможно, посмотрите на это: https://webrtc.github.io/samples/

Это приложение для чата для Chrome и Firefox, разработанное google, я предполагаю с видом CC-License

Ответ 4

У меня была аналогичная проблема (также с использованием recorder.js) и удалось решить, используя превосходный videoconverter.js проект, который включает в себя порт от ffmpeg до Javascript с помощью emscripen. Недостатком этого является файл ffmpeg.js около 25 МБ.

Я изменил существующую функцию exportWAV в recorderWorker.js, чтобы вернуть как WAV (для воспроизведения HTML5 <audio>), так и Blob, содержащий закодированный файл MP2:

function encodeWAV(samples) {

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

  /* ... various writing methods */

  return { wavdata: new Blob([buffer], { type: "audio/wav" }), mp2data: ffmpeg_convert(buffer) };
}

function ffmpeg_convert(buffer) {
    console.log("starting mp2 conversion");
    var args = "-i input -f mp2 output.mp2";
    var results = ffmpeg_run({
        arguments: args.split(" "),
        files: [
          {
              data: new Uint8Array(buffer),
              "name": "input"
          }
        ]
    });
    if (results) {
        var file = results[0];
        console.log("File recieved", file.name, file.data);
        return new Blob([file.data], { type: "audio/mpeg" });
    }
    return null;
}

Этот метод может использоваться для кодирования WAV для любого кодека, поддерживаемого ffmpeg libavcodec

Ответ 5

Мне удалось добиться сжатия с помощью opus.js,

вы можете найти мою реализацию здесь: recordOpus, но есть уловка, моя связана с серверной стороной, и я использую node.js сервер....