conversion.fichier wav.ogg en javascript

j'essaie de capturer l'entrée audio de l'utilisateur à partir du navigateur. Je l'ai fait avec WAV mais les fichiers sont vraiment gros. Un ami m'a dit que les fichiers OGG sont beaucoup plus petits. Quelqu'un sait-il comment convertir WAV en OGG? J'ai aussi le tampon de données brutes, Je n'ai pas vraiment besoin de convertir. Mais j'ai juste besoin de l'encodeur OGG.

Voici l'encodeur WAV de Matt Diamond's 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;
}

est il un pour OGG?

26
demandé sur Donal Lafferty 2013-07-08 20:20:36

4 réponses

à ceux qui ont voté contre ce post: il n'est vraiment pas productif de voter contre des questions sans prendre le temps d'offrir une sorte de perspective sur la raison pour laquelle la question Est en quelque sorte "mauvaise". Je pense que cette question a du Mérite, et l'affiche a clairement passé un certain temps à essayer de résoudre le problème par eux-mêmes. Le Web Audio spec est en fait destiné à permettre exactement ce genre de fonctionnalité, mais n'est pas encore proche de remplir ce but:

cette spécification décrit une API JavaScript de haut niveau pour le traitement et la synthèse audio dans les applications web. Le paradigme principal est un graphique de routage audio, où un certain nombre d'objets Audionodes sont connectés ensemble pour définir le rendu audio global. Le traitement réel aura principalement lieu dans l'implémentation sous-jacente (généralement optimisé Assembly / C / C++ code), mais direct le traitement et la synthèse JavaScript est également soutenu .

Voici une déclaration sur le W3C actuel audio Spec draft , qui fait les points suivants:

  • lors du traitement audio en JavaScript, il est extrêmement difficile d'obtenir un audio fiable, sans problème, tout en obtenant une latence raisonnablement faible, surtout sous une lourde charge de processeur.
  • JavaScript est beaucoup plus lent que lourdement optimisé le code C++ et n'est pas capable de tirer profit des optimisations SSE et du multi-threading qui est critique pour obtenir de bonnes performances sur les processeurs d'aujourd'hui. Le code natif optimisé peut être de l'ordre de vingt fois plus rapide pour le traitement des FFTs que le JavaScript. Il n'est pas assez efficace pour le traitement intensif de l'audio comme la convolution et la spatialisation 3D d'un grand nombre de sources audio.
  • setInterval () et XHR handling vont voler du temps le traitement audio. Dans un jeu raisonnablement complexe, certaines ressources JavaScript seront nécessaires pour la physique des jeux et les graphiques. Cela crée des défis parce que le rendu audio est basé sur la date limite (pour éviter les problèmes et obtenir une latence assez faible). JavaScript ne s'exécute pas dans un thread de traitement en temps réel et peut donc être préempté par de nombreux autres threads tournant sur le système.
  • la collecte des ordures (et les piscines autorelease sur Mac OS X) peut causer des retards imprévisibles sur un JavaScript fil.
  • plusieurs contextes JavaScript peuvent être en cours d'exécution sur le thread principal, en volant le temps du contexte qui fait le traitement.
  • autre code (autre que JavaScript) tel que le rendu de page fonctionne sur le fil principal.
  • Les serrures
  • peuvent être prises et la mémoire est allouée sur le thread JavaScript. Cela peut causer une préemption de thread supplémentaire.
  • les problèmes sont encore plus difficiles avec la génération actuelle de les appareils mobiles qui ont des processeurs avec des performances relativement faibles et des problèmes de consommation d'énergie / batterie-vie.

ECMAScript (js) est vraiment rapide pour beaucoup de choses, et est de plus en plus rapide tout le temps selon quel moteur interprète le code. Pour quelque chose d'aussi intensif que le traitement audio cependant, vous seriez beaucoup mieux en utilisant un outil de bas niveau qui est compilé pour optimiser les ressources spécifiques à la tâche. J'utilise actuellement ffmpeg du côté du serveur pour accomplir quelque chose de similaire.

je sais que c'est vraiment inefficace pour envoyer un fichier wav à travers une connexion internet juste pour obtenir un plus compact .fichier ogg, mais c'est l'état actuel des choses avec l'api web audio. Pour effectuer tout traitement côté client, l'utilisateur devrait explicitement donner accès au système de fichiers local et les privilèges d'exécution du fichier pour effectuer la conversion. J'espère que quelqu'un s'adressera ce problème flagrant bientôt. Bonne chance.

Modifier: Vous pouvez également utiliser le natif-client de Google si cela ne vous dérange pas de limiter vos utilisateurs à Chrome. Il semble comme technologie très prometteuse qui charge dans un bac à sable et atteint des vitesses presque aussi bon code exécuté nativement. Je suppose qu'il y aura des implémentations similaires dans d'autres navigateurs à un moment donné.

16
répondu jtrick 2017-05-23 12:26:11

cette question me rend fou parce que je n'ai vu personne trouver une solution vraiment propre, donc j'ai créé ma propre bibliothèque:

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

usage de base

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

      recorder.record(); // Start recording

      recorder.stop();  /Stop recording

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

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

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

});

en utilisant l'option d'encodage mp3 continu, il est tout à fait raisonnable de capturer et d'encoder l'entrée audio entièrement dans le navigateur, cross-browser, sans serveur ou code natif.

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

il est encore rugueux sur les bords, mais je vais essayer de nettoyer / réparer.

10
répondu sam 2015-06-19 06:43:24

NOUVELLE : travail Dérivé de Matt Diamant recorderjs l'enregistrement de Ogg-Opus

pour coder à Ogg-Opus un fichier en entier dans un navigateur sans extensions SPÉCIALES, On peut utiliser un port Emscripten de opus-tools/opusenc 1519130920" (Démo) . Il est livré avec le soutien de décodage pour WAV, AIFF et un couple d'autres formats et un re-sampler intégré.

Un Ogg Vorbis codeur est également disponible .

puisque l'auteur de la question Est principalement sorti pour la compression audio, ils pourraient également être intéressés par mp3 encodage utilisant lame .

4
répondu Rainer Rillke 2015-07-15 19:46:41

Ok, ce n'est peut-être pas une réponse directe car il ne dit pas comment convertir .wav en .ogg . Encore une fois, pourquoi s'embêter avec la conversion, quand vous pouvez le fichier .ogg directement. Cela dépend de MediaRecorder API , mais les navigateurs qui prennent en charge WebAudio ont généralement cela aussi (Firefox 25+ et Chrome 47+)

github.io Démo

Github Code Source

1
répondu mido 2016-03-18 02:19:11