web-dev-qa-db-fra.com

Changer la fréquence d'échantillonnage de AudioContext (getUserMedia)

J'essaie d'enregistrer un enregistrement à 48000Hz via getUserMedia. Mais sans chance. L'audio MediaStream renvoyé renvoie 44100Hz. Comment puis-je régler ceci à 48000Hz?

Voici des extraits de mon code:

var startUsermedia = this.startUsermedia;

            navigator.getUserMedia({ 
                audio: true, 
                //sampleRate: 48000 
            }, startUsermedia, function (e) {
                console.log('No live audio input: ' + e);
            });

La fonction startUsermedia:

startUsermedia: function (stream) {
            var input = audio_context.createMediaStreamSource(stream);
            console.log('Media stream created.');
            // Uncomment if you want the audio to feedback directly
            //input.connect(audio_context.destination);
            //__log('Input connected to audio context destination.');

            recorder = new Recorder(input);
            console.log('Recorder initialised.');
        },

J'ai essayé de changer la propriété sampleRate de AudioContext, mais sans succès.

Comment puis-je changer le sampleRate à 48000Hz?

EDIT: Nous sommes également d'accord avec une solution flash capable d'enregistrer et d'exporter des fichiers wav à 48000Hz

20
f.lorenzo

Autant que je sache, il n’ya aucun moyen de modifier la fréquence d’échantillonnage dans un contexte audio. Le taux d'échantillonnage correspond généralement au taux d'échantillonnage de votre appareil d'enregistrement et le restera. Donc, vous ne pourrez pas écrire quelque chose comme ceci:

var input = audio_context.createMediaStreamSource(stream);
var resampler = new Resampler(44100, 48000);
input.connect(resampler);
resampler.connect(audio_context.destination);

Cependant, si vous souhaitez utiliser votre flux audio, le rééchantillonner puis l'envoyer au serveur (ou le faire autrement en dehors de l'API Web Audio), vous pouvez utiliser un convertisseur de fréquence d'échantillonnage externe (par exemple https: //github.com/taisel/XAudioJS/blob/master/resampler.js ). 

   var resampler = new Resampler(44100, 48000, 1, 2229);

   function startUsermedia(stream) {
        var input = audio_context.createMediaStreamSource(stream);
        console.log('Media stream created.');


        recorder = audio_context.createScriptProcessor(2048);
        recorder.onaudioprocess = recorderProcess;
        recorder.connect(audio_context.destination);
    }

    function recorderProcess(e) {
        var buffer = e.inputBuffer.getChannelData(0);
        var resampled = resampler.resampler(buffer);
        //--> do sth with the resampled data for instance send to server
    }
13
basilikum

Il semble y avoir un bogue ouvert concernant l'impossibilité de définir le taux d'échantillonnage:

https://github.com/WebAudio/web-audio-api/issues/300

Il y a aussi un problème de Chrome:

https://bugs.chromium.org/p/chromium/issues/detail?id=432248

J'ai vérifié le dernier code Chromium et rien dedans ne permet de définir le taux d'échantillonnage.

3
Timmmm

Vous pouvez utiliser OfflineAudioContext pour essentiellement rendre votre tampon audio à une fréquence d'échantillonnage différente (mais il s'agit d'une opération par lots).

Donc, vous enregistreriez votre enregistrement en utilisant le contexte audio normal, puis utiliseriez un texte OfflineAudioContext avec un taux d'échantillonnage différent pour rendre votre tampon. Il y a un exemple sur la page Mozilla.

2
Guillaume Belrose

Tu ne peux pas. Le taux d'échantillonnage de AudioContext est défini par le navigateur/le périphérique et vous ne pouvez rien faire pour le modifier. En fait, vous constaterez que 44,1 kHz sur votre machine pourrait être de 48 kHz sur la mienne. Cela varie selon le choix du système d'exploitation par défaut.

N'oubliez pas non plus que tout le matériel n'est pas capable de toutes les fréquences d'échantillonnage.

2
Brad

Il est maintenant dans les spécifications mais pas encore implémenté dans Chromium . De même dans bugs.chromium.org, "Statut: Disponible" ne signifie pas qu'il est implémenté. Cela signifie simplement que personne ne travaille dessus et qu'il est disponible pour quiconque veut travailler dessus. Donc, "Disponible" signifie "Non assigné".

0
Julien