Преобразование 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.
Спасибо!
Ответы
Ответ 1
Я сделал аудиозапись, которая записывает в mp3 прямо из браузера, совмещая RecorderJS и libmp3lame.js
Здесь вы можете найти проект gitHub:
https://github.com/nusofthq/Recordmp3js
и более подробное объяснение реализации:
http://nusofthq.com/blog/recording-mp3-using-only-html5-and-javascript-recordmp3-js/
Ответ 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
сервер....