web-dev-qa-db-fra.com

Conversion de WAV en n'importe quel format audio compressé en JavaScript côté client

J'enregistre de l'audio à partir de getUserMedia({audio:true}); dans le navigateur en utilisant Recorder.js puis je l'exporte en tant que fichier WAV car c'est la seule option que la bibliothèque propose.

Un fichier de 1 minute 20 secondes mesure 14,1 Mo. J'ai besoin de télécharger l'audio sur un serveur et je dois le faire rapidement. Comment convertir l'audio WAV dans un autre format compressé pour réduire la taille du fichier?

Cela ne me dérange pas de me convertir en:

  • MP3
  • Opus
  • WebM
  • Ogg
  • FLAC
  • tout autre format que vous connaissez

S'il n'y a aucun moyen pour l'instant de convertir à l'un de ces formats, comment puis-je compresser le fichier WAV sur le client?

PS: J'ai fait beaucoup de recherches pour trouver quelque chose qui convertit WAV en JS, mais je n'ai rien trouvé. libmp3lame.js ne fonctionne pas dans Chrome.

Merci!

31
Arjun Bajaj

J'ai créé un enregistreur audio qui enregistre au format mp3 directement depuis le navigateur en combinant RecorderJS et libmp3lame.js

Vous pouvez trouver le projet gitHub ici: https://github.com/nusofthq/Recordmp3js

et une explication plus détaillée de l'implémentation: http://nusofthq.com/blog/recording-mp3-using-only-html5-and-javascript-recordmp3-js/

31
Remus Negrota

Ce que vous voulez vraiment, c'est l '"API d'enregistrement" mediaStream, sur laquelle vous travaillez actuellement. Jusqu'à ce que ce soit disponible, je conseille d'utiliser emscriptem sur la source C/C++, et envisagez de l'exécuter dans un webworker pour éviter de bloquer l'interface utilisateur et d'autres onglets.

4
jesup

J'étais confronté au même problème et j'ai trouvé une solution assez rapide et sale:

  • Compressez le fichier wav avec Zip.js (fonctionne avec Chrome, Firefox, Safari 6 et Internet Explorer 10)

Plus d'informations voir Documentation Zip.js

Au moins, cela réduit considérablement la taille, le fichier est environ> 75% plus petit, donc compression 1: 4

MISE À JOUR: Peut-être jetez un œil à ceci: https://webrtc.github.io/samples/

Il s'agit d'une application de chat pour Chrome et Firefox développé par google, je suppose avec une sorte de licence CC

3
AddingColor

J'ai eu un problème similaire (en utilisant également recorder.js) et j'ai réussi à résoudre en utilisant le superbe projet videoconverter.js qui comprend un port de ffmpeg vers Javascript en utilisant emscripen. L'inconvénient est que le fichier ffmpeg.js fait environ 25 Mo.

J'ai modifié la fonction exportWAV existante dans recorderWorker.js pour renvoyer à la fois un WAV (pour HTML5 <audio> playback) et un Blob contenant un fichier MP2 encodé:

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;
}

Cette méthode peut être utilisée pour coder le WAV en n'importe quel codec supprimé par libavcodec de ffmpeg

2
CodingIntrigue

J'ai pu réaliser la compression en utilisant opus.js ,

vous pouvez trouver mon implémentation ici: recordOpus , mais il y a un hic, le mien est couplé avec côté serveur, et j'utilise node.js serveur ....

1
mido